【问题标题】:Javascript Linked List merge returning undefinedJavascript链接列表合并返回未定义
【发布时间】:2019-05-12 03:01:09
【问题描述】:

尝试合并来自 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 指针。

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

【问题讨论】:

    标签: javascript linked-list


    【解决方案1】:

    我可能是错的,但您似乎正在将res 复制到curr。除非你是通过引用来做的,否则它应该分开处理。这意味着您对curr 所做的所有更改都不会反映在res 上。

    【讨论】:

    • 认为这个 JS 的一切都是通过引用完成的。 Object.assign 可以在这里工作吗?
    • 如果一直是通过引用,您将面临很多问题。然而,@shawon 似乎一针见血。
    【解决方案2】:

    当您执行current = res 时,它会将持有的引用currentres 更新为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;
    };
    

    【讨论】:

    • 啊,我明白了,我用l1/l2 引用覆盖了curr,因此失去了对res 的处理。嗯,我明白了……
    猜你喜欢
    • 2019-12-30
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多