簡體   English   中英

我對 LeetCode 問題的解決方案運行良好,直到我嘗試使用輔助函數對其進行改進。 沒有返回參數

[英]My solution to a LeetCode problem works fine, until I try to improve it by using a helper function. The argument isn't being returned

嘿,提前感謝您的幫助!

所以我在嘗試解決 LeetCode 問題時似乎在實現輔助函數時遇到了問題。 我已經找到了一個可行的解決方案,但是當我嘗試在輔助函數中包裝重復的邏輯時,似乎沒有返回參數。

問題是合並兩個排序的鏈表並將其作為新的排序列表返回。 應該通過將前兩個列表的節點拼接在一起來制作新列表。 這是 LC 上問題的鏈接: https : //leetcode.com/problems/merge-two-sorted-lists/

這是我的工作解決方案:

var mergeTwoLists = function(l1, l2) {
    let dummyHead = new ListNode(0),
        q = l1,
        v = l2,
        curr = dummyHead;
    while (q !== null || v !== null) {
        if (q && v) {
            if ( q.val !== null && v.val !== null) {
                if (q.val <= v.val) {
                    curr.next = new ListNode(q.val);
                    curr = curr.next;
                    q = q.next;        
                } else {
                    curr.next = new ListNode(v.val);
                    curr = curr.next;
                    v = v.next;
                }
            } else if (q.val !== null) {
                curr.next = new ListNode(q.val);
                curr = curr.next;
                q = q.next;
            } else {
                curr.next = new ListNode(v.val);
                curr = curr.next;
                v = v.next;
            }
        } else if (q) {
            curr.next = new ListNode(q.val);
            curr = curr.next;
            q = q.next;
        } else {
            curr.next = new ListNode(v.val);
            curr = curr.next;
            v = v.next;
        }      
    }
    return dummyHead.next;
};

如您所見,在我的解決方案中多次重復相同的步驟。 一旦我嘗試使用輔助函數處理它,似乎返回的參數curr存在問題。 每次函數由算法運行時,它總是顯得新鮮。

我確定我遺漏了一些明顯的東西。 任何幫助將不勝感激:) 這是使用輔助函數實現的解決方案:

var mergeTwoLists = function(l1, l2) {
    let dummyHead = new ListNode(0),
        q = l1,
        v = l2,
        curr = dummyHead;
    while (q !== null || v !== null) {
        if (q && v) {
            if ( q.val !== null && v.val !== null) {
                if (q.val <= v.val) {
                    attachNode(curr, q);
                } else {
                    attachNode(curr, v);
                }
            } else if (q.val !== null) {
                attachNode(curr, q);
            } else {
                attachNode(curr, v);
            }
        } else if (q) {
            attachNode(curr, q);
        } else {
            attachNode(curr, v);
        }    
    }
    return dummyHead.next;
};

function attachNode(curr, value) {
    curr.next = new ListNode(value.val);
    curr = curr.next;
    value = value.next;
    return curr;
}

你在函數作用域上犯了一個錯誤。 如果你有這樣的功能

function f(arg) {
    arg = 'another value';
}

那么調用范圍內的arg不會改變。 參數arg是調用范圍內參數的副本,其值不會改變調用范圍內的參數:

let arg = 'some value';
f(arg);
arg === 'some value'; // this is true

看起來您在某種程度上正在考慮這一點,因為您從函數返回cur但您沒有將值分配給任何東西。

  • 我們不必將value設置為value.next因為列表已經排序;

  • Linked List 中,只需跟蹤鏈接並連接它們就足夠了:

遞歸:

const mergeTwoLists = function(l1, l2) {
    if (l1 === null) {
        return l2;
    }

    if (l2 === null) {
        return l1;
    }

    if (l1.val < l2.val) {
        l1.next = mergeTwoLists(l1.next, l2)
        return l1;

    } else {
        l2.next = mergeTwoLists(l1, l2.next)
        return l2;
    }
}

迭代:

const mergeTwoLists = function(l1, l2) {
    const sentinel = {
        val: -1,
        next: null
    };

    let head = sentinel;
    while (l1 && l2) {
        if (l1.val > l2.val) {
            head.next = l2;
            l2 = l2.next;
        } else {
            head.next = l1;
            l1 = l1.next;
        }
        
        head = head.next;
    }

    head.next = l1 || l2;

    return sentinel.next;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM