题目一解题思路:
两链表中长度较长的一条作为存储结果的链表,假设第一条链表的长度较长。需要考虑链表长度不等的三种情况。其中第一条链表的长度小于第二条时,需要连接第一条链表和第二条链表多出来的尾巴,所以在进行后向遍历时需要有一个prev指针——同时这个prev指针在两链表长度一致时也可以保存多出来的进位(假如有的话)。
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *pa =l1,*pb = l2;
int car = 0,sum=0;
ListNode *prev = NULL;
while(pa && pb){
sum = (pa->val+pb->val+car)%10;
car = (pa->val+pb->val+car)/10;
pa->val = sum;
prev = pa;
pa = pa->next;
pb = pb->next;
}
if(pa==NULL && pb==NULL && car>0)
prev->next = new ListNode(car);
while(pa){
sum = (pa->val+car)%10;
car = (pa->val+car)/10;
pa->val = sum;
if(pa->next==NULL && car>0){
pa->next = new ListNode(car);
car = 0;
}
pa = pa->next;
}
if(pb){
prev->next = pb;
while(pb){
sum = (pb->val+car)%10;
car = (pb->val+car)/10;
pb->val = sum;
if(pb->next==NULL && car>0){
pb->next = new ListNode(car);
car = 0;
}
pb = pb->next;
}
}
return l1;
}
};
题目二解题思路:
使用经典头插法先反转两个链表,在使用题目一中的方法对反转后的链表求和(注意有些步骤可以优化,prev指针可以多次使用),最后对求得的结果再进行反转。
class Solution {
public:
ListNode* reverseList(ListNode* head){
ListNode *dummy = new ListNode(0);
ListNode *cur = head;
while(cur){
ListNode *tmp = cur->next;
cur->next = dummy->next;
dummy->next = cur;
cur = tmp;
}
return dummy->next;
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
l1 = reverseList(l1);
l2 = reverseList(l2);
ListNode *pa=l1,*pb=l2;
int sum=0,car=0;
ListNode *prev = NULL;
while(pa && pb){
sum = (pa->val+pb->val+car)%10;
car = (pa->val+pb->val+car)/10;
pa->val = sum;
prev = pa;
pa = pa->next;
pb = pb->next;
}
while(pa){
sum = (pa->val+car)%10;
car = (pa->val+car)/10;
pa->val = sum;
prev = pa;
pa = pa->next;
}
if(pb){
prev->next = pb;
while(pb){
sum = (pb->val+car)%10;
car = (pb->val+car)/10;
pb->val = sum;
prev = pb;
pb = pb->next;
}
}
if(pa==NULL && pb==NULL && car>0)
prev->next = new ListNode(car);
return reverseList(l1);
}
};