ID:2.两数相加

50 阅读1分钟

考点:链表

题目链接

题目

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

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

思路

注意一下链表题比较常见的一个小技巧:用一个dummyHead记录结果链表的初始节点

var addTwoNumbers = function(l1, l2) {
    // 定位结果链表的第一位
    const dummyHead = new ListNode();
    dummyHead.next = l1;
    // 两个遍历指针
    let cur1 = l1, cur2 = l2;
    let c = 0; // 进位
    while(cur1 && cur2) {
        let sum = cur1.val + cur2.val + c;
        cur1.val = Math.floor(sum % 10); // 保留值
        c = Math.floor(sum / 10);        // 进位
        if(!cur1.next || !cur2.next) {
            break;
        }
        cur1 = cur1.next;
        cur2 = cur2.next;
    }
    // 如果cur1比较短,把cur2长的部分接到cur1后面
    if(!cur1.next) {
        cur1.next = cur2.next;
        cur2 = null;
    }
    // 继续遍历cur1
    while(cur1.next) {
        cur1 = cur1.next;
        let sum = cur1.val + c;
        cur1.val = Math.floor(sum % 10);
        c = Math.floor(sum / 10);
    }
    // 如果数字首位(即链表末位的两个数字)相加仍有进位,再添加一个链表节点
    if(c !== 0) {
        const last = new ListNode(1);
        cur1.next = last;
    }
    return dummyHead.next;
};