我有以下代码,花了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
};
答案 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
};