题目介绍
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 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… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
用栈来实现
- 遍历两个遍历分别入栈, s1,s2
- 判断s1,s2是否有元素,有元素就进入循环,栈顶部数组相加还有加上上一次相加的进位数取 10的余数,这就是当前节点的值,并且要记录当前数的进位数
- 如果s1,s2都没有元素了,最后判断进位数是否大于0如果是,还要进入循环一次,把进位数的节点补上
代码
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var addTwoNumbers = function(l1, l2) {
let s1 = []
let s2 = []
while(l1 || l2) {
if (l1) {
s1.push(l1)
l1 = l1.next
}
if (l2) {
s2.push(l2)
l2 = l2.next
}
}
let pre = 0
let newHead = null
while(s1.length || s2.length || pre > 0) {
let s1Val = s1.length ? s1.pop().val : 0
let s2Val = s2.length ? s2.pop().val : 0
let newVal = s1Val + s2Val + pre
pre = parseInt(newVal / 10)
let node = new ListNode(newVal % 10)
node.next = newHead
newHead = node
}
return newHead
};