LeetCode第445题:两数相加Ⅱ

225 阅读2分钟

题干

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

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

进阶:

如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。

示例:

输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 8 -> 0 -> 7

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ad… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法:栈

这道题与两数相加的区别是,两数相加为我们进行了数字的逆序,所以我们直接就可以操作链表来进行类似的竖式运算,我们只需要处理计算的逻辑即可。而这道题就是给了我们数据的初始,所以我们应该将他们转换为可以计算的形式,这时我们就要想到另外的一种数据结构——栈,我们依次将两个链表的数据压入栈中,再依次计算栈顶元素,这时我们就可以得到我们想要的结果。

还有一点需要注意的是,我们依次计算的结果的顺序是从后到前的,所以我们不能按照常规的存入链表方式来将得到的结果值存入,而是要使用头插法,使每次插入的节点都跟在head的next节点上。这样就保证了我们结果的顺序。

代码实现:

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function (l1, l2) {
    let stack1 = [];
    let stack2 = [];
    while (l1 != null) {
        stack1.push(l1.val);
        l1 = l1.next;
    }
    while (l2 != null) {
        stack2.push(l2.val);
        l2 = l2.next;
    }
    let newListNode = new ListNode(0);
    let current = newListNode;
    let yu = 0;
    let zhi = 0;
    while (stack1.length > 0 && stack2.length > 0) {
        let stack1data = stack1.pop();
        let stack2data = stack2.pop();
        zhi = (stack1data + stack2data + yu) % 10;
        headInsertToList(current, zhi)
        yu = Math.floor((stack1data + stack2data + yu) / 10);
    }
    if (stack1.length != 0) {
        while (stack1.length != 0) {
            let stack1data = stack1.pop();
            zhi = (stack1data + yu) % 10;
            headInsertToList(current, zhi)
            yu = Math.floor((stack1data + yu) / 10);
        }
    }
    if (stack2.length != 0) {
        while (stack2.length != 0) {
            let stack2data = stack2.pop();
            zhi = (stack2data + yu) % 10;
            headInsertToList(current, zhi)
            yu = Math.floor((stack2data + yu) / 10);
        }
    }
    if (yu != 0) {
        headInsertToList(current, yu)
    }
    return newListNode.next
};
function headInsertToList(current, zhi) {
    let newNode = new ListNode(zhi)
    newNode.next = current.next;
    current.next = newNode
}