方案一:遞歸
思路:
1.判斷鏈表是否爲空,如果是空,返回相反的鏈表就是結果
2.依次取出兩個鏈表的值進行相加,如果不用進位,就依次插入下一個節點 ,遞歸地調用,然後返回鏈表即可。
3.如果計算進位,先算這一位進位後的結果newList;再計算下一位要加多少carry;其次在考慮不進位的條件下,下一位的結果current;最後把carry 和 current 做加和,也就是下一位數插入下一個節點 ,遞歸調用返回即可。
4.遞歸的邊界條件是有一個指針爲空,返回另一個(條件1),不用做處理。
/**
* 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) {
if(!l1){
return l2;
}
if(!l2){
return l1;
}
if(l1->val + l2->val < 10){
ListNode* newList = new ListNode(l1->val+l2->val);
newList->next = addTwoNumbers(l1->next,l2->next);
return newList;
}
ListNode* newList = new ListNode((l1->val+l2->val)%10);
ListNode* carry = new ListNode((l1->val+l2->val)/10);
ListNode* current = addTwoNumbers(l1->next,l2->next);
newList->next = addTwoNumbers(carry,current);
return newList;
}
};
方案二:插值法
創建一個和值進行保存兩條鏈當前值和上次的進位,每次插入節點的都是和值的餘數(也就是個位,sum %10),然後在記錄十位也就是進位(sum / 10),進行下次鏈表值求和。
/**
* 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* head = new ListNode(-1);
ListNode* pre = head;
int sum = 0;
while(l1 || l2 || sum){
if(l1){
sum += l1->val;
l1 = l1->next;
}
if(l2){
sum += l2->val;
l2 = l2->next;
}
pre->next = new ListNode(sum % 10);
pre = pre->next;
sum /= 10;
}
return head->next;
}
};