难度: 中等
题目
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 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
进阶:如果输入链表不能修改该如何处理?换句话说,不能对列表中的节点进行翻转。
思路
- 使用栈
- 翻转链表
题解
/**
* 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) {
// 定义栈结构
class Stack {
arr = []
// 出栈
get() {
return this.arr.pop()
}
// 入栈
add(...args) {
this.arr.push(...args)
}
// 判断栈是否为空
isEmpty() {
return this.arr.length === 0
}
}
// 将 l1, l2 入栈
const addStack = (l, stack) => {
if (l == null) return
stack.add(l)
if (l.next) {
addStack(l.next, stack)
}
}
let stack1 = new Stack()
addStack(l1, stack1)
let stack2 = new Stack()
addStack(l2, stack2)
let newListNode = null
// 进位
let further = 0
while((stack1 && !stack1.isEmpty()) || (stack2 && !stack2.isEmpty()) || further !== 0) {
let val = (stack1 ? !stack1.isEmpty() ? stack1.get().val : 0 : 0) + (stack2 ? !stack2.isEmpty() ? stack2.get().val : 0 : 0) + further
further = 0
if (val - 10 >= 0) {
val = val - 10
further = 1
}
let node = new ListNode(val)
node.next = newListNode
newListNode = node
}
return newListNode
};
结果
执行用时:148 ms, 在所有 JavaScript 提交中击败了13.45%的用户
内存消耗:47.3 MB, 在所有 JavaScript 提交中击败了5.11%的用户
通过测试用例:1563 / 1563
优化点
看来似乎没必要在算法题中, 搞出真正的栈结构