LeetCode两数相加JS实现

两数相加

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

解法

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function (l1, l2) {
    let isAll = [0, 0];
    let nowNode = new ListNode()
    nowNode.val = l1.val + l2.val
    nowNode.next = null
    result = nowNode
    for (let i = 0; ; i++) {
        if (l1.next == null) {
            isAll[0] = 1
        }
        if (l2.next == null) {
            isAll[1] = 1
        }
        if (isAll[0] == 1 && isAll[1] == 1) {
            if (nowNode.val < 10) {
                return result
            } else {
                let nextNode = new ListNode()
                nextNode.next = null
                nowNode.val -= 10
                nextNode.val = 1
                nowNode.next = nextNode
                return result
            }
        }
        if (isAll[0] == 0) l1 = l1.next
        if (isAll[1] == 0) l2 = l2.next
        let nextNode = new ListNode()
        nextNode.next = null
        nextNode.val = isAll[0] == 0 ? l1.val : 0
        nextNode.val = isAll[1] == 0 ? nextNode.val + l2.val : nextNode.val
        if (nowNode.val > 9) {
            nowNode.val -= 10
            nextNode.val += 1
        }
        nowNode.next = nextNode
        nowNode = nextNode
    }
};

复杂度分析

  • 时间复杂度: O ( max ⁡ ( m , n ) ) O(\max(m, n)) O(max(m,n))
  • 空间复杂度: O ( max ⁡ ( m , n ) ) O(\max(m, n)) O(max(m,n))

请特别注意以下情况

  • 当一个列表比另一个列表长时
  • 当一个列表为空时,即出现空列表
  • 求和运算最后可能出现额外的进位,这一点很容易被遗忘

你可能感兴趣的:(LeetCode)