首页 > 解决方案 > 从链表 JavaScript 添加两个数字

问题描述

给定两个表示两个非负整数的非空链表(以相反的顺序),将两个数字相加并将总和作为链表返回。

Input: l1 = [2,4,3], l2 = [5,6,4]
Output: [7,0,8]
Explanation: 342 + 465 = 807.

我这边一切正常,但是在 leetcode 上有一个运行时错误,我不太明白为什么。这是我的代码:

const l1 = [2,4,3]
const l2 = [5,6,4]

const addTwoNumbers = (l1, l2) => {
    l1 = reverseLinkedList(l1)
    l2 = reverseLinkedList(l2)
    const l1sum = linkedListNum(l1)
    const l2sum = linkedListNum(l2)
    let sum = l1sum + l2sum
    // for 0 sum
    if (!sum) return [sum]
    const l3 = [];
    while (sum > 0) {
        l3.push(sum % 10);
        sum /= 10;
        sum = Math.trunc(sum)
    }
    return l3
}

const reverseLinkedList = (ll) => {
    let rev = []
    for (let i = ll.length - 1; i >= 0; i--) {
        rev.push(ll[i])
    }
    return rev
}

const linkedListNum = (ll) => {
    let sum
    for (let i = 0; i < ll.length; i++) {
        if (!i) {
            sum = ll[i]
            continue
        }
        sum *= 10
        sum += ll[i]
    }
    return sum
}

const answer = addTwoNumbers(l1,l2)
console.log(answer);
// answer output: [7,0,8]

这是错误:

Line 65 in solution.js
             throw new TypeError(__serialize__(ret) + " is not valid value for thereturn type ListNode")
             ^
TypeError: [null] is not valid value for the expected return type ListNode
    Line 65: Char 20 in solution.js (Object.<anonymous>)
    Line 16: Char 8 in rumner.is (Object.runner)
    Line 49: Char 26 in solution.js (Object.<anonymous>)
    Line 1251: Char 30 in loader.js (Module._compile)
    Line 1272: Char 10 in loader.js (Object.Module._extensions..is)
    Line 1100: Char 32 in loader.is (Module.load)
    Line 962: Char 14 in loader.js (Function.Module._load)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
    Line 17: Char 47 in run_main_module.js

无关:这是我关于堆栈溢出的第一个问题,让我知道我是怎么做的。

标签: javascript

解决方案


使用现代数组方法可以实现更简单的方法

  1. 从每个数组创建一个数字

  2. 将它们加在一起

  3. 将其强制转换回字符串,将其反转,然后map将元素转换回数字。

const a1 = [2,4,3];
const a2 = [5,6,4];

// Take an array, reverse it, join it up into a string
// again and make it a number
const getNumber = arr => Number(arr.reverse().join(''));

// Sum the numbers from each array
const getSum = (arr1, arr2) => getNumber(arr1) + getNumber(arr2);

// Coerce the number to a string, split it into an array
// and reverse it, and map the strings back to numbers
const getResult = sum => sum.toString().split('').reverse().map(Number);    

// Get the result
console.log(getResult(getSum(a1, a2)));


推荐阅读