方案一:递归
思路:
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;
}
};