两数相加 II
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 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
进阶:如果输入链表不能翻转该如何解决?
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ad… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
题目中提到,需要输出一个链表,那么我们可以想到两种解决方法
-
在原链表上进行操作
-
使用栈,记录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;
};