给定两个非空的链表,表示两个非负整数。 数字以相反的顺序存储,每个节点包含一个数字。 添加两个数字并将其作为链表返回。
可以假设两个数字不包含任何前导零,除了数字0本身
举例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
分析:使用变量跟踪进位,并从包含最低有效数字的列表头开始模拟逐位数字和。
两个相加数字的可视化:342 + 465 =807。
每个节点包含单个数字,数字以相反的顺序存储。
就如在纸上相加两个数字一样,我们先将最低有效位的数字相加,即l1和l2的头部。由于每个数字都在0~9之间,所以两个数字相加可能会导致“溢出”(例如5+7=12)。这时,我们将当前数字设为2,并将carry=1移入下一次迭代。carry必须为0或者1,两位数最大的可能为9+9+1(进位)=19,carry不可能为2及以上的数字。
伪代码如下:
请注意,我们使用虚拟头来简化代码。 没有一个虚拟头,你将不得不编写额外的条件语句来初始化头的值。
//java代码
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(0);
ListNode p = l1, q = l2, curr = dummyHead;
int carry = 0;
while (p != null || q != null) {
int x = (p != null) ? p.val : 0;
int y = (q != null) ? q.val : 0;
int sum = carry + x + y;
carry = sum / 10;
curr.next = new ListNode(sum % 10);
curr = curr.next;
if (p != null) p = p.next;
if (q != null) q = q.next;
}
if (carry > 0) {
curr.next = new ListNode(carry);
}
return dummyHead.next;
}
/**
* c++代码
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode c1 = l1;
ListNode c2 = l2;
ListNode sentinel = new ListNode(0);
ListNode d = sentinel;
int sum = 0;
while (c1 != null || c2 != null) {
sum /= 10;
if (c1 != null) {
sum += c1.val;
c1 = c1.next;
}
if (c2 != null) {
sum += c2.val;
c2 = c2.next;
}
d.next = new ListNode(sum % 10);
d = d.next;
}
if (sum / 10 == 1)
d.next = new ListNode(1);
return sentinel.next;
}
}
如有问题,欢迎批评指正。