445. Add Two Numbers II
方法1: reverse linked list
方法2: recursion
思路:将短的链前面补零,然后不断递归调用计算carry。参考369. Plus One Linked List。但是这里的不同点是,需要沿途新生成node, 并且返还已经填好数的该node的指针。
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
if (!l1) return l2;
if (!l2) return l1;
int s1 = 0, s2 = 0;
ListNode* l1p = l1;
ListNode* l2p = l2;
while (l1p) {
l1p = l1p -> next;
s1 ++;
}
while (l2p) {
l2p = l2p -> next;
s2 ++;
}
ListNode* newHead = new ListNode(-1);
ListNode* cur = newHead;
for (int i = 0; i < abs(s1 - s2); i++){
cur -> next = new ListNode(0);
cur = cur -> next;
}
cur -> next = (s1 <= s2) ? l1: l2;
l1 = s1 <= s2 ? newHead -> next: l1;
l2 = s1 <= s2 ? l2: newHead -> next;
int carry = 0;
ListNode* head = dfs(l1, l2, carry);
if (carry){
ListNode* tip = new ListNode(1);
tip -> next = head;
head = tip;
}
return head;
}
ListNode* dfs(ListNode* l1, ListNode* l2, int & carry){
if (!l1 && !l2) return nullptr;
ListNode* newNode = dfs(l1 -> next, l2 -> next, carry);
int digit = l1 -> val + l2 -> val + carry;
carry = digit / 10;
int val = digit % 10;
ListNode* current = new ListNode(val);
current -> next = newNode;
return current;
}
};