leetcode 148 鍊錶排序

2021-10-18 13:18:03 字數 1288 閱讀 3734

題目: 用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在陣列儲存下的歸併排序,需要借出輔助空間完成,而鍊錶儲存的歸併排序,不需要借助輔助空間,直接在原來的鍊錶上進行操作,...