0

Trying to merge two sorted list question from LeetCode, keep running into undefined result:

/**
 * 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;
};

Not sure why res is returning undefined. From what I can tell, I'm setting res to be the head pointer for the resulting linked list nodes and performing the following logic:

While L1 or L2 has not reached its end, compare values.
IF L1.val is less than or equal to L2.val, set it to the current node, then bump up the pointer for L1 to the next value.
ELSE do the mirror for L2.

Once the current node value is set, bump up the node to the next item (either L1.next or L2.next, which will be overridden by the next larger value from either of the lists) and repeat.

Once we reach the end of either L1 or L2, set the remaining linked list to the current node, then return the head res pointer of the full list.

Not sure where I'm going wrong here with the logic, maybe it's getting a little late haha. Apologies if this has been repeated, appreciate any help!

2 Answers 2

2

When you are doing current = res it updates the reference current is holding from res to l1/l2. To avoid this, what you want to do is to set the next node of current instead of the variable current itself. The following code works -

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;
};
Sign up to request clarification or add additional context in comments.

1 Comment

Ah I see, I was overriding curr with l1/l2 reference, thus losing my handle on res. Hmm I see...
1

I could be wrong but it looks like you're making a copy of res into curr. Unless you're doing it by reference, it should treat those separately. Meaning all changes you're making to curr are not being reflected on res.

2 Comments

Thought everything this JS was done by reference. Would an Object.assign work here?
If it was by reference all the way you'd face a lot of issues. However it looks like @shawon hit the nail on the head.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.