携手创作,共同成长!这是我参与「掘金日新计划 · 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;
};