[英]Merge-sort in a Linked List
我目前正在練習或面試,並且正在針對鏈接列表問題進行合並排序。
給定一個鏈表(具有next
和val
屬性) 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
。
我想我真的很接近,但是我不確定我搞砸了哪一部分。
請幫忙。
編輯
我通過將L
和R
更改為l1
和l2
並更改來解決了這個問題
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.