【问题标题】:JavaScript Adding two linkedlist values with recursionJavaScript 使用递归添加两个链表值
【发布时间】:2019-01-25 04:57:20
【问题描述】:

我有以下代码,花了 6 个小时试图解决,但没有运气。它被 1 -> 8, 0 -> null 作为输入的 LinkedList 卡住了。我的输出只是 1 -> null 我不知道为什么。我试图手动完成我的代码,它应该创建新的“next = {val: 8, next: null}”,但它没有发生......

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */


const traversal = function(l1, l2, s, n) {
    if (l1 !== null && l2 !== null) {
        n.val = l1.val + l2.val + s;
    } else if (l1 !== null && l2 === null && !s) {
        n.val = l1.val + s;
    } else if (l1 === null && l2 !== null && !s) {
        n.val = l2.val + s;
    } else if (l1 === null && l2 === null && s) {
        n.val = s
    }
    s = 0;
    if (n.val > 9) {
        s = Number(n.val.toString()[0])
        n.val = Number(n.val.toString()[1])
    }
    if (l1 === null && l2 === null && !s) {
        return;
    }
    if (l1 !== null && l2 !== null && l1.next && l2.next) {
        n.next = new ListNode
        traversal(l1.next, l2.next, s, n.next)
    } else if (l1 !== null && l2 === null && l1.next !== null && l2.next === null) {
        n.next = new ListNode
        traversal(l1.next, null, s, n.next)
    } else if (l1 === null && l2 !== null && l1.next === null && l2.next !== null) {
        n.next = new ListNode
        traversal(null, l2.next, s, n.next)
    } else if (l1.next === null && l2.next === null && s) {
        n.next = new ListNode
        traversal(null, null, s, n.next)
    }

}

var addTwoNumbers = function(l1, l2) {
    let storage = 0;
    const result = new ListNode
    traversal(l1, l2, storage, result)
    //console.log(result.next)
    return result
};

【问题讨论】:

  • 对于初学者,您需要正确声明您的新节点:new ListNode(0)。使用括号调用构造函数并传递任何必要的参数很重要。我正在尝试让它立即工作,但也许您可以更清楚地了解 addTwoNumbers 函数期望作为参数的内容?
  • 是的,也许您可​​以提供我们正在处理的确切数据作为我们函数的参数。否则,很难理解你为什么要写你迄今为止所拥有的。
  • 嗨,本,非常感谢您的帮助。这是 leetcode 的完整提示:leetcode.com/problems/add-two-numbers
  • 谢谢,这是非常重要的信息,现在我看到了。
  • 没问题!我刚刚看到您的编辑建议,而我遇到问题的测试输入确实是 [1, 8] 和 [0]。对不起,如果我写的方式可能让你感到困惑。

标签: javascript linked-list


【解决方案1】:

好的,我真的不知道你的代码在做什么,对此我深表歉意,但我自己解决这个问题确实很有趣,所以这是我使用 ES6 的完整解决方案。如果你想看看它的实际效果并玩弄它,你可以将整个代码放入 index.js 并使用 Node.js 运行它,或者只是将其插入 Leetcode 中进行验证。

function ListNode(val) {
  this.val = val;
  this.next = next;
}

const getValue = (stringVal, node) => {
  return node.next === null
    ? Number(node.val + stringVal)
    : Number(getValue(node.val + stringVal, node.next))
}

const listify = number => number.toString()
  .split('')
  .map(Number)
  .reduce((next, digit) => {
    const node = new ListNode(digit)
    node.next = next
    return node
  }, null)

const addTwoNumbers = (l1, l2) => {
  return listify(getValue('', l1) + getValue('', l2))
}

const first = { val: 2, next: { val: 4, next: { val: 3, next: null} } }
const second = { val: 5, next: { val: 6, next: { val: 4, next: null} } }

addTwoNumbers(first, second)

【讨论】:

  • 感谢您的尝试,本!你的代码看起来很棒!但我希望有人能指出我的代码做错了什么......我觉得我在这里遗漏了一些东西。
  • 这种方法在 javascript 的安全整数中效果很好。当您超过最大安全整数时,getValue 将返回科学计数法。因此,您将不得不编写一个新方法来处理非常大的数字。
【解决方案2】:

我发现了问题。这是我将“null”传递给每个递归的方式。我添加了一个非常糟糕的条件来检查“l1”或“l2”是否为空(例如 l1 === null),正如您在我的问题中的代码中看到的那样。它在我的 if/else 语句中导致了各种问题,该语句检查 l1 或 l2 节点的下一个值是否存在。

我删除了它并决定改变我以仍然有两个键(val,next)的节点的形式传递“不存在”的方式。现在我可以消除糟糕的情况,问题就解决了!这是有效的代码 - 这是一种蛮力方法,但我想让它工作。

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */

/*
result = {
    val: 1,
    next: null,
}
*/

const traversal = function(l1, l2, s, n) {
    if (l1 !== null && l2 !== null) {  // result value is all values added
        n.val = l1.val + l2.val + s; //n.val = 1
    } else if (l1 !== null && l2 === null && !s) { //result value is l1 + s
        n.val = l1.val + s;
    } else if (l1 === null && l2 !== null && !s) { //result value is l2 + s
        n.val = l2.val + s;
    } else if (l1 === null && l2 === null && s) { //result value is only s
        n.val = s
    }
    s = 0; //reset storage
    if (n.val > 9) { //false
        s = Number(n.val.toString()[0])
        n.val = Number(n.val.toString()[1])
    }
    let none = {val: null, next: null}
    if (l1.val === null && l2.val === null && !s) { //base case
        return;
    }
    if (l1.next && l2.next) { //both have next node
        n.next = new ListNode
        traversal(l1.next, l2.next, s, n.next)
    } else if (l1.next !== null && l2.next === null) { //only l1 has next node
        n.next = new ListNode
        traversal(l1.next, none, s, n.next)
    } else if (l1.next === null && l2.next !== null) { //only l2 has next node
        n.next = new ListNode
        traversal(none, l2.next, s, n.next)
    } else if (s) { //both has no next node but has a carryover
        n.next = new ListNode
        traversal(none, none, s, n.next)
    }
}

var addTwoNumbers = function(l1, l2) {
    let storage = 0;
    const result = new ListNode
    traversal(l1, l2, storage, result)
    return result
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    相关资源
    最近更新 更多