題目: 用nlog(n) 的時間複雜度,實現鍊錶的排序
思路: 列表或者陣列可以直接用歸併排序來做,但是鍊錶沒法做,因為鍊錶只有順序關係,很難定位到乙個元素(中點)。在這裡需要對歸併排序做一些改動
tip:
如何定位到鍊錶中點?———雙指標法
雙指標法。沒錯,就是之前判斷鍊錶有環的方法。乙個指標走一步,乙個指標走兩步,當快指標走到頭時,慢指標的前乙個節點就是中點元素
找到中點元素就好辦了! 歸併!
class solution:
'''這段** 太美了!!!! 贊
'''def sortlist(self, head: listnode) -> listnode:
if not head:
return none
return self.mergesort(head)
def mergesort(self, node:listnode) -> listnode:
# 遞迴出口
if not node.next:
return node
p1 = node
p2 = node
# 找到中點 如何找到鍊錶中點? 還是雙指標法
cute = none
while p1 and p1.next:
cute = p2
p2 = p2.next
p1 = p1.next.next
# 分割成兩段
cute.next = none
l1 = self.mergesort(node)
l2 = self.mergesort(node)
# merge
return self.mergetowlists(l1,l2)
def mergetowlists(self,l1,l2):
# 做乙個虛假的頭
phead = listnode(-1)
temp = phead
while l1 and l2:
if l1.val < l2.val:
temp.next = l1
l1 = l1.next
else:
temp.next = l2
l2 = l2.next
temp = temp.next
if l1:
temp.next = l1
if l2:
temp.next = l2
return phead.next
鍊錶 排序鍊錶(leetcode 148
在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。以下解析來自於 常見排序方法有很多,插入排序,選擇排序,堆排序,快速排序,氣泡排序,歸併排序,桶排序等等。它們的時間複雜度不盡相同,而這裡題目限定了時間必須為o nlgn 符合要求只有快速排序,歸併排序,堆排序 所以說,本題 l...
leetcode 148鍊錶排序 (001)
方法 參考 因為有時間複雜度要求o nlogn 所以考慮歸併排序。歸併排順是不斷的把待排的部分分成兩部分。技巧 使用快慢指標,慢指標每走一步,快指標走兩步。最後結束,剛好慢指標走到中間。1 首先判斷元素個數,如果為空或者只有乙個,直接返回。2 定義兩個快慢指標,和乙個pre指標,指向第一部分的最後乙...
Leetcode 148 排序鍊錶
在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。示例 1 輸入 4 2 1 3 輸出 1 2 3 4示例 2 輸入 1 5 3 4 0 輸出 1 0 3 4 5在陣列儲存下的歸併排序,需要借出輔助空間完成,而鍊錶儲存的歸併排序,不需要借助輔助空間,直接在原來的鍊錶上進行操作,...