题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
code
- 直接版
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* res = new ListNode(0), *p = res;
int c=0;//进位
int sum=0;//和
while(l1&&l2){
sum = (l1->val+l2->val+c)%10;
c = (l1->val+l2->val+c)/10;
ListNode* next = new ListNode(sum);
p->next = next;
p = p->next;
l1=l1->next;
l2=l2->next;
}
while(l1){
sum = (l1->val+c)%10;
c = (l1->val+c)/10;
ListNode* next = new ListNode(sum);
p->next = next;
p = p->next;
l1=l1->next;
}
while(l2){
sum = (l2->val+c)%10;
c = (l2->val+c)/10;
ListNode* next = new ListNode(sum);
p->next = next;
p = p->next;
l2=l2->next;
}
if(c!=0){
ListNode* next = new ListNode(1);
p->next = next;
}
return res->next;
}
};
- 简洁版
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* res = new ListNode(0), *p = res;
int c=0;//进位
int sum=0;//和
while(l1||l2||c){
int val1 = l1==NULL ? 0 : l1->val;
int val2 = l2==NULL ? 0 : l2->val;
sum = val1+val2+c;
c = sum/10;
ListNode* next = new ListNode(sum%10);
p->next = next;
p = p->next;
if(l1)
l1 = l1->next;
if(l2)
l2 = l2->next;
}
return res->next;
}
};
测试数据
输入 | 输出 |
---|---|
[0] ; [0] | [0] |
[];[] | [] |
[9,9,9];[2,4,0,8] | [1,4,0,9] |