37-leetCode: 445. 两数相加 II

104 阅读1分钟

题目

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

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

示例1:

输入: l1 = [7,2,4,3], l2 = [5,6,4]
输出: [7,8,0,7]

输入: l1 = [2,4,3], l2 = [5,6,4]
输出: [8,0,7]

输入: l1 = [0], l2 = [0]
输出: [0]

解题思路

设定两个栈,将两个链表从头开始入栈,得到两个可以从尾部pop的数组栈;因为两数之和大于1要进位,设置进位step初始值为0,定义空节点来接收最终的结果; 开始循环,终止条件是两栈为空同时step 为0, 循环内将两数组栈pop出两个数与step相加,大于10 step 设为1 ,否则为0,当前值取余,最后将的到的值接入空节点形成链表

/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function(l1, l2) {
    // 定义两个栈
    let l1List = [];
    let l2List = [];
    // 将两个链表的值分别入栈
    while(l1) {
        l1List.push(l1.val);
        l1 = l1.next;
    } 
    while(l2) {
        l2List.push(l2.val);
        l2 = l2.next;
    }
    
    let vNode = null;
    let step = 0; // 进位标识
    while(l1List.length || l2List.length || step) {
        // 取两栈的末尾值
        let a = l1List.length ? l1List.pop() : 0;
        let b = l2List.length ? l2List.pop() : 0;
        let curr = a + b + step; // 要与进位相加的到结果
        step = Math.floor(curr / 10); // 更新进位
        curr = curr % 10; // 取当前值个位数

        // 连接链表:总是将当前值至于链表首位,最后得到正确的顺序
        let currNode = new ListNode(curr);
        currNode.next = vNode;
        vNode = currNode;
    }
    // 结果链表
    return vNode;
};