试图合并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
指针,并执行以下逻辑:
当L1
或L2
尚未结束时,请比较值
如果L1.val
小于或等于L2.val
,请将其设置为当前节点,然后将L1
的指针提升到下一个值
ELSE为L2
做镜像。
设置当前节点值后,将节点提升到下一个项目(L1.next
或L2.next
,将被任一列表中的下一个较大值覆盖(,然后重复。
一旦我们到达L1
或L2
的末尾,将剩余的链表设置为当前节点,然后返回完整列表的头res
指针。
不确定我的逻辑哪里错了,也许有点晚了,哈哈。如果再次出现这种情况,我们深表歉意,感谢您的帮助!
执行current = res
时,它会将current
保持的引用从res
更新为l1
/l2
。为了避免这种情况,您需要设置current
的next
节点,而不是变量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
上。