簡體   English   中英

鏈接列表中的合並排序

[英]Merge-sort in a Linked List

我目前正在練習或面試,並且正在針對鏈接列表問題進行合並排序。

給定一個鏈表(具有nextval屬性) 4-2-1-3 ,我應該在O(nlogn)中將其排序為1-2-3-4 因此,我嘗試使用合並排序到鏈表。 下面是我的代碼。

def sortList(self, head):
    """
    :type head: ListNode
    :rtype: ListNode
    """

    if head.next:

        # find mid point

        mid = fast = head
        while fast.next and fast.next.next:
            mid = mid.next
            fast = fast.next.next

        # split linkedList into two

        L = head
        R = mid.next
        mid.next = None

        # recursively call mergeSort to Left and Right Lists

        self.sortList(L)
        self.sortList(R)

        # pointers for merging

        newPtr = newHead = ListNode(-1)
        newHead.next = newPtr

        # merge and sort

        while L and R:
            if L.val < R.val:
                newPtr.next = L
                L = L.next
            else:
                newPtr.next = R
                R = R.next
            newPtr = newPtr.next
        # for remaining nodes
        while L:
            newPtr.next = L
            newPtr = newPtr.next
            L = L.next
        while R:
            newPtr.next = R
            newPtr = newPtr.next
            R = R.next

        return newHead.next

    else:
        return head

我覺得我的合並排序算法是正確的,但是上面輸入的結果使我1-3-4缺少2

我想我真的很接近,但是我不確定我搞砸了哪一部分。

請幫忙。

編輯

我通過將LR更改為l1l2並更改來解決了這個問題

        self.sortList(L)
        self.sortList(R)

這個到

        L = self.sortList(l1)
        R = self.sortList(l2)

其他部分相同,現在我有相同的答案。 但是,我不確定更改如何產生影響。

當遞歸調用sortList時,局部函數變量R和L可能不再是其各自列表段的開頭。 然后,后續的合並操作將“跳過”原始節點之前的排序列表部分,從而導致輸出不完整。

您的更改通過將R和L分配給已排序鏈的頭,從而確保R和L具有合並的每個子列表的有效頭。

暫無
暫無

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

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