【面试题 02.05】链表求和
问题
给定两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。
示例
输入: (7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295
输出: 2 -> 1 -> 9,即912
解答
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* dum = new ListNode(0);
ListNode* cur = dum;
int carry = 0;
while (l1 || l2 || carry) {
if (l1) {
carry += l1->val;
l1 = l1->next;
}
if (l2) {
carry += l2->val;
l2 = l2->next;
}
ListNode* node = new ListNode(carry % 10);
cur = cur->next = node;
carry /= 10;
if ((!l1 || !l2) && carry == 0) { // 由于是链表,可以直接连接后续
cur->next = l1 ? l1 : l2;
break;
}
}
return dum->next;
}
};
重点思路
每次计算一个节点,需要上一位的进位和两个链表的对应位置。