🏒

445. 两数相加 II

💛
难度: 中等

题目

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例1:
notion image
输入: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. 使用栈
  1. 翻转链表

题解

/**
 * 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

优化点

看来似乎没必要在算法题中, 搞出真正的栈结构