给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
几个容易忽略的输入:
[9,8]
[1]
[2,4,3]
[5,6,4]
[5]
[5]
一开始把题目想的特别简单,直接逐位加就行了,甚至链表已经是逆序了都不用再逆算。
代码如下(来回折腾几个特殊情况,就突然想换个方式去算):
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
//ListNode * add(ListNode*)
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode * result = l1;
ListNode* pre = NULL;
ListNode * HEAD = result;
int value = 0;
if(l1 == NULL || l2 ==NULL){ //特殊输入
return l1==NULL?l1:l2;
}
if(l1->val == 0 || l2->val ==0){ //特殊输入
return l1->val==0?l2:l1;
}
while(result!=NULL && l2!=NULL){
result->val = result->val + l2->val+ value;
if(result->val>=10){ //进位判断
value = result->val /10;
result->val %=10;
}
else{
value = 0;
}
if(l2->next ==NULL && result->next!=NULL){ //2比1短
pre = result;
result = result->next;
if(value==0){
result->val += value;
value = 0;
}
break;
}
else if(l2->next!=NULL && result->next == NULL){ //1比2短
while(l2->next!=NULL){
pre = result;
result = l2->next;
}
break;
}
pre = result;
result = result->next;
l2 = l2->next;
}
if(value!=0){ //create new point
result = pre;
ListNode *newPoint = new ListNode(value);
newPoint->val = value; //为超出的进位创建新结点
result->next = newPoint;
result = result->next;
}
return HEAD;
}
};
然而链表长短各不相同来回折腾样例半天,突然想到一个更直接的方式……
分开算,不用这样每次一起算。上一个方法等同于把2往1上加,所以要判断长短不同的情况。
分开算直接创建一个新的链表,每次循环创建一个结点即可。
class Solution {
public:
//ListNode * add(ListNode*)
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode * HEAD = new ListNode(0);
ListNode * tmp = HEAD;
int value = 0;
while(l1!=NULL || l2!=NULL){
if(l1){
value += l1->val;
l1 = l1->next;
}
if(l2){
value += l2->val;
l2 = l2->next;
}
//deal with sum
tmp->next = new ListNode(value%10);
value /= 10;
tmp = tmp->next;
}
if(value){
tmp->next = new ListNode(1);
}
return HEAD->next;
}
};