JavaScript通过递归添加两个链表值

时间:2019-01-25 04:57:20

标签: javascript linked-list

我有以下代码,花了6个小时尝试解决运气不佳的问题。它卡在LinkedList的1-> 8、0-> null作为输入中。我的输出仅为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
};

2 个答案:

答案 0 :(得分:0)

好吧,我真的不知道您的代码在做什么,对此我深表歉意,但是我自己解决这个问题确实很有趣,所以这是我使用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)

答案 1 :(得分:0)

我发现了问题。这就是我将“ 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
};