445. 两数相加 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
栈的思想
思路
这道题目我们用栈的思想来解决
因为我们要吧两个链表分别传承一个数字,最后来进行相加
- 第一想法:直接转成数字相加,再转为链表
结果是不行。因为js能表达的数字最大只有十几位,链表长了就会NAN
- 栈的思想
加法中我们肯定要从末尾开始计算,如果大于10可则要进一位,对高位的结果有影响
- 所以我们这里用两个栈stack1和stack2来保存两个链表遍历的结果
- 接着我们再次遍历两个栈,只要有任何一个有值就可以,从末尾弹出最后一个值,这样符合我们加法规则,进行计算,如果>=10则要进1,用pre来保存十位上的数字,curr表示个位个位上的数字
- pre上的数字在计算完毕后要进行重置,否则影响下一次的计算
- 接下来我们只需要用插头法,一个一个的把新生成的节点拼在旧节点的前面,就生成一个新的节点
- 最后遍历结束后可能pre还有值,进行最后的节点生成
返回新生成的链表
var addTwoNumbers = function (l1, l2) {
var stack1 = []
var stack2 = []
var p1 = l1
var p2 = l2
while (p1) {
stack1.push(p1.val)
p1 = p1.next
}
while (p2) {
stack2.push(p2.val)
p2 = p2.next
}
var res = null
var pre = 0
var curr = 0
while (stack1.length || stack2.length) {
var pop1 = stack1.pop()
var pop2 = stack2.pop()
var num1 = pop1 ? pop1 * 1 : 0
var num2 = pop2 ? pop2 * 1 : 0
var total = pre ? num1 + num2 + pre : num1 + num2
pre = 0
if (total >= 10) {
curr = total % 10
pre = (total - curr) / 10
} else {
curr = total
}
var newHead = new ListNode(curr)
newHead.next = res
res = newHead
curr = 0
}
if(pre){
var newHead = new ListNode(pre)
newHead.next = res
res = newHead
}
return res
};