题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
| 12
 3
 
 | 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8
 原因:342 + 465 = 807
 
 | 
题解
链表已经是从低位存储。所以从低位向高位遍历,如果有进位或者高位,创建下个节点并遍历下一位。
复杂度
- 时间复杂度:O(max(M,N))
- 空间复杂度:O(max(M,N)+1)
代码
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 
 | 
 
 
 
 
 
 
 
 ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
 auto p1 = l1;
 auto p2 = l2;
 ListNode root(0);
 auto p = &root;
 int carry = 0;
 while (p1 || p2) {
 int v1 = p1 ? p1->val : 0;
 int v2 = p2 ? p2->val : 0;
 int v = v1 + v2 + carry;
 carry = v / 10;
 v = v % 10;
 p->next = new ListNode(v);
 p = p->next;
 p1 = p1 ? p1->next : NULL;
 p2 = p2 ? p2->next : NULL;
 }
 if (carry > 0) {
 p->next = new ListNode(carry);
 }
 return root.next;
 }
 
 |