• leetCode 刷题 两数相加


        刷题第一天 两数之和

         原题目:

    给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
    * <p>
    * 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
    * <p>
    * 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
    * <p>
    * 示例:
    * <p>
    * 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
    * 输出:7 -> 0 -> 8
    * 原因:342 + 465 = 807
    @Data
    public class ListNode {
    
        private int val;
        private ListNode next;
    
        public  ListNode(int val) {
            this.val = val;
        }
    
        /**  注意点:1.在两个链表长度不等时需要校验
         *          2.curr 作为 result的内存地址的引用,当curr的值变化时并没有改变result的指向,只是改变的result内存的值,
         *          开辟了result的内存空间
          *@author latiao
         * @Date  2019/9/20
         **/
    
        public static ListNode solution(ListNode l1, ListNode l2) {
            //初始化一个非空列表作为结果
            ListNode result = new ListNode(0);
            ListNode a = l1, b = l2,curr = result;
            int carry = 0;
            //当a或者b不都为空时说明,有下一位数字,需要继续相加
            while (a != null || b != null) {
                //如果为空则设置为0,用于加操作
                int x = a != null ? a.val : 0;
                int y = b != null ? b.val : 0;
                //计算值和;carry为上一个节点满10进1的结果
                int sum = carry + x + y;
                //int类型默认向下取整,若大于10 则进1
                carry = sum / 10;
                curr.next = new ListNode(sum % 10) ;
                curr = curr.next;
                if (a != null) {
                    a = a.next;
                }
                if (b != null) {
                    b = b.next;
                }
            }
            if (carry > 0) {
                curr.next = new ListNode(carry);
            }
            return result.next;
        }
      public static void main(String[] args) {
            ListNode l1 = new ListNode(2);
            l1.next = new ListNode(4);
            l1.next.next = new ListNode(3);
    
            ListNode l2 = new ListNode(5);
            l2.next = new ListNode(6);
            l2.next.next = new ListNode(4);
            System.out.println(solution(l1, l2));
           
        }
    }

     上面值得注意的一点  curr 作为 result的内存地址的引用,当curr的值变化时并没有改变result的指向,只是改变的result内存的值,开辟了result的内存空间

        比如下面的例子 

      public static List<String> reference() {
            List<String> a = new ArrayList<String>();
            a.add("1");
            a.add("2");
            List<String> b =a;
            b.add("3");
            return  a;
        }
    public static void main(String[] args) {
    System.out.println(reference());//[1, 2, 3]
    }
     

     我们使用b去添加一个新的数据3 ,最终a也改变了值

           

    遇事犹豫不决时,须持虎狼之心,行仁义之事
  • 相关阅读:
    [leetcode]133. Clone Graph 克隆图
    [leetcode]366. Find Leaves of Binary Tree捡树叶
    [leetcode]311. Sparse Matrix Multiplication 稀疏矩阵相乘
    [leetcode]151. Reverse Words in a String翻转给定字符串中的单词
    [leetcode]150. Evaluate Reverse Polish Notation逆波兰表示法
    Union and Intersection of two sorted lists 并集和交集
    [leetcode]205. Isomorphic Strings 同构字符串
    [leetcode]428. Serialize and Deserialize N-ary Tree序列化与反序列化N叉树
    [leetcode]364. Nested List Weight Sum II嵌套列表加权和II
    属性 元素的内容 创建,插入和删除节点 虚拟节点
  • 原文地址:https://www.cnblogs.com/fmlyzp/p/11555119.html
Copyright © 2020-2023  润新知