leetcode-链表-445-两数相加 II

96 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情

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

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

 

示例1:

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

输出:[7,8,0,7]

示例2:

输入:l1 = [2,4,3], l2 = [5,6,4]

输出:[8,0,7] 示例3:

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

提示:

链表的长度范围为 [1, 100] 0 <= node.val <= 9 输入数据保证链表代表的数字无前导 0

思路

1.这道题采用栈的思路来实现

2.首先一起看下这道题的整体思路,首先将两个链表的值分别存入栈中,然后分别将两个栈的值计算相加,从后向前,最后将数组的结果转成链表,返回即可。这个就是整体的思路,接下来我们一起详细的实现这到算法题。

3首先定义两个空数组来分别存入两个链表的值

let stack1 = [];
let stack2 = [];

4.然后将两个链表的值,分别存入对应的栈中

while (l1 !== null) {
        stack1.push(l1.val);
        l1 = l1.next;
    }
    while (l2 !== null) {
        stack2.push(l2.val);
        l2 = l2.next;
    }

5.然后从后向前 将栈中的两个值相加,最后计算出sum。这里要注意的一个地方是,相加的时候,满10进位补0.

6.最后定义链表dmy = curr = { next: null };将sum转成链表,返回dmy.next即可

代码

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 sum = [];
    let add = 0;
    let len1 = stack1.length - 1;
    let len2 = stack2.length - 1;
    while (len1 >= 0 || len2 >= 0) {
        let u1 = stack1[len1--] || 0;
        let u2 = stack2[len2--] || 0;
        sum.unshift((u1 + u2 + add) % 10);
        u1 + u2 + add > 9 ? add = 1 : add = 0;
    }
    if (add === 1) sum.unshift(1);

    // 将数组结果转成链表
    let dmy = curr = { next: null };
    let i = 0;
    while (i < sum.length) {
        curr.next = new ListNode(sum[i++], null);
        curr = curr.next;
    }

    return dmy.next;
};