leetCode 刷题 两数相加

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也改变了值