【面试题 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;
    }
};

重点思路

每次计算一个节点,需要上一位的进位和两个链表的对应位置。

posted @ 2021-03-29 11:02  tmpUser  阅读(45)  评论(0编辑  收藏  举报