题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807
题解
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode q = l1, p = l2; ListNode dummyHead = new ListNode(0); ListNode carr = dummyHead; int carry = 0; while (q != null || p != null) { int x = q != null ? q.val : 0; int y = p != null ? p.val : 0; int sum = x + y + carry; carry = sum / 10; carr.next = new ListNode(sum % 10); carr = carr.next; if (q != null) q = q.next; if (p != null) p = p.next; } if (carry > 0) { carr.next = new ListNode(carry); } return dummyHead.next; }}
手记
carry(进位)是一个很重要的变量,两个一位数相加,进位只可以是 0 或 1 ,两个数相加再加前数的进位,最大值也只为 19,例如 96 + 97,个位相加:得 3 进 1,十位相加为:9 + 9 + 1 = 19。
再看此题,链表为逆序存储数字,我们读取数字时,就是从最低位开始的,这符合我们的运算习惯。我们每读取两个链表的各一位数字,便将它们与前进位相加,结果超过 10 的部分为本次运算的进位,不超过 10的部分为本次运算留在本位的值,只要两个链表有一个不为空,两个链表将再次进位计算。
30行代码表示,如果计算结束,但上次进位值大于 0(值为 1),则将进位补到最高位。
附
很不错的题,优解的写法看的让人着迷。
以上