Почему этот код не проходит проверку на leetcode, несмотря на то что работает в браузере

Задача такова: даны два массива с числами, нужно развернуть каждый массив, в каждом из массивов соединить все числа в одно, например: [5, 3, 1] становится 135, во втором массиве [2,4,8] становится 842.

Затем получить сумму этих двух получившихся чисел.

И наконец, вернуть массив состоящий из цифр той суммы.
Ссылка на задачу

вот мой код, который правильно выводит каждый пример на сайте. На при запуске кода редактор на сайте показывает очень странную ошибку "l1.reverse is not a function" хотя l1 это массив

    var addTwoNumbers = function(l1, l2) {
        // проверка что массив l1 содержит цифры от 0 до 9
        for (let i = 0; i < l1.length; i++) {
            if(l1[i] < 0 || l1 > 9) return  
        }
            // проверка что массив l2 содержит цифры от 0 до 9
            for (let i = 0; i < l2.length; i++) {
                if(l2[i] < 0 || l2 > 9) return  
            }
            
            // получаю  сумму всех чисел в обоих массивах, предворительно
            // развернув массив, сделав из него строку а затем превратив строку в число
            let arrSum = +l1.reverse().join('') + +l2.reverse().join('')
            
            // превращаю сумму в строку, а затем эту строку в массив, и делаю реверс масива
            let reverseArrSum = (arrSum + '').split('').reverse();
            let res = []
            // числа в массиве являются строками, поэтому делаем из них числа
            // и закидываем в новый массив res
            for(let i = 0; i < reverseArrSum.length; i++) {
                if(reverseArrSum[i])
                res.push(+reverseArrSum[i])
            }
            return res
        };

Ответы (2 шт):

Автор решения: Qwertiy

Потому что в массивах может быть 100 элементов. Double не поддерживает такую точность. Пробуй BigInt, если он там работает.

→ Ссылка
Автор решения: Grundy

В тексте задачи явно указывается

You are given two non-empty linked lists

Что означает, на вход подаются связные списки, а не массивы.

Далее в комментариях перед кодом указано определение для элементов списка

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

Так как значения параметров не массивы, при попытке вызвать у них метод массива и вызывает указанную ошибку.


Как было справедливо указано, подход с переводом списка в число и обратно, может не сработать из-за большого размера. Вместо этого необходимо было реализовать поразрядное сложение, с переносом лишнего в старший разряд.

Алгоритм довольно простой:

  1. взять текущие элементы списков
  2. сложить их и добавить перебор с прошлой итерации
  3. сохранить последнюю цифру результата
  4. если сумма больше 10 - установить в перебор 1 иначе 0
  5. повторять 1-4 пока есть элементы в списках, либо перебор не равен 0
→ Ссылка