[路飞]_leetcode_445. 两数相加 II

124 阅读1分钟

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

你可以假设除了数字 0 之外,这两个数字都不会以零开头。

示例1:

7 -> 2 -> 4 -> 3
     5 -> 6 -> 4
_________________
7 -> 8 -> 0 -> 7

解题思路

从示例1可以看出链表越靠后,位数越小,那么在做加法时,都是从小位数往大位数做加法。 由于链表只能从前往后遍历,我们可以将两个链表做反转,这样就可以达到我们想要的效果了

var addTwoNumbers = function(l1, l2) {
    let pre1 = reverse(l1);
    let pre2 = reverse(l2);
    let cur = null;
    let carry = 0;
    while (pre1 || pre2) {
        let sum = Number(pre1 ? pre1.val : 0) + Number(pre2 ? pre2.val : 0) + carry;
        carry = Math.floor(sum / 10);
        sum = sum % 10;
        cur = new ListNode(sum, cur)
        pre1 = pre1 ? pre1.next : null;
        pre2 = pre2 ? pre2.next : null;
    }
    
    if (carry) cur = new ListNode(carry, cur);

    return cur
};

var reverse = function (head) {
    let pre = null, cur = head;
    while (cur) {
        let next = cur.next;
        cur.next = pre;
        pre = cur;
        cur = next;
    }
    return pre;
}