两数相加 II

133 阅读1分钟

两数相加 II

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

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

 

示例1:

plum.jpg

输入: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  

进阶:如果输入链表不能翻转该如何解决?

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

思路

题目中提到,需要输出一个链表,那么我们可以想到两种解决方法

  1. 在原链表上进行操作

  2. 使用栈,记录l1,l2的val,然后栈1和栈2相加,再组成一个新的栈输出

我们现在用第二种方法的思路来实现:

先while循环两个链表,链表的值记录在栈1和栈2中

两栈数值相加,得到一个新栈

然后while循环,把栈的值赋给一个新的链表,输出即可

代码


var addTwoNumbers = function (l1, l2) {
    // 创建两个stack,储存l1,l2的val
    // 创建List,记录两stack相加的值
    let stack1 = [],
        stack2 = [],
        List = [];
    // l1,l2分别赋值给对应的stack中
    while (l1) {
        stack1.push(Number(l1.val));
        l1 = l1.next;
    }
    while (l2) {
        stack2.push(Number(l2.val));
        l2 = l2.next;
    }
    // 创建一个变量num用来计算两数相加是否>9,若>9,则下一轮计算再加上1
    let num = 0;
    // 进行两stack的相加计算
    while (stack1.length || stack2.length || num != 0) {
        let num1 = stack1.length ? stack1.pop() : 0,
            num2 = stack2.length ? stack2.pop() : 0;
        List.push((num1 + num2 + num) % 10);
        num = num1 + num2 + num > 9 ? 1 : 0;
    }
    // 创建一个新的链表,用来return
    // 创建一个指针,指向表头
    let header = new ListNode(-1, null),
        headerPre = header;
    // 循环赋值,并且移动指针
    for (let i = List.length - 1; i >= 0; i--) {
        headerPre.next = new ListNode(List[i], null);
        headerPre = headerPre.next;
    }
    return header.next;
};