刷题第一天 两数之和
原题目:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 ** 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 *
* 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 *
* 示例: *
* 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) * 输出:7 -> 0 -> 8 * 原因:342 + 465 = 807
@Datapublic 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 Listreference() { List a = new ArrayList (); a.add("1"); a.add("2"); List b =a; b.add("3"); return a; }
public static void main(String[] args) { System.out.println(reference());//[1, 2, 3] }
我们使用b去添加一个新的数据3 ,最终a也改变了值