Javascript链表合并返回未定义



试图合并LeetCode中的两个排序列表问题,一直运行到未定义的结果:

/**
* Definition for singly-linked list.
* function ListNode(val) {
*     this.val = val;
*     this.next = null;
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var mergeTwoLists = function(l1, l2) {
var res = new ListNode();
var curr = res;
while(l1 !== null && l2 !== null) {
if(l1.val <= l2.val) {
// Set current node to l1 if less than or equal
curr = l1;
// Move l1's head to next
l1 = l1.next
} else {
// Else same case for l2
curr = l2;
l2 = l2.next;
}
// Move current to next
curr = curr.next
}
if (l1 !== null) {
curr = l1;
} else if (l2 !== null) {
curr = l2;
}
return res;
};

不确定res返回undefined的原因。据我所知,我将res设置为结果链表节点的head指针,并执行以下逻辑:

L1L2尚未结束时,请比较值
如果L1.val小于或等于L2.val,请将其设置为当前节点,然后将L1的指针提升到下一个值
ELSE为L2做镜像。

设置当前节点值后,将节点提升到下一个项目(L1.nextL2.next,将被任一列表中的下一个较大值覆盖(,然后重复。

一旦我们到达L1L2的末尾,将剩余的链表设置为当前节点,然后返回完整列表的头res指针。

不确定我的逻辑哪里错了,也许有点晚了,哈哈。如果再次出现这种情况,我们深表歉意,感谢您的帮助!

执行current = res时,它会将current保持的引用从res更新为l1/l2。为了避免这种情况,您需要设置currentnext节点,而不是变量current本身。以下代码有效-

var mergeTwoLists = function(l1, l2) {
var res = new ListNode();
var curr = res;
while(l1 !== null && l2 !== null) {
if(l1.val <= l2.val) {
// Set current node to l1 if less than or equal
curr.next = l1;
// Move l1's head to next
l1 = l1.next
} else {
// Else same case for l2
curr.next = l2;
l2 = l2.next;
}
// Move current to next
curr = curr.next
}
if (l1 !== null) {
curr.next = l1;
} else if (l2 !== null) {
curr.next = l2;
}
return res.next;
};

我可能错了,但看起来您正在将res复制到curr中。除非你是通过引用来做的,否则它应该单独对待这些。这意味着您对curr所做的所有更改都不会反映在res上。

最新更新