148 排序鍊錶

2021-10-01 18:46:08 字數 1329 閱讀 5504

難度:中等

題目描述:

思路總結:題目要求時間複雜度o(nlog(n)),想到二分——>想到歸併。歸併遞迴解法,額外空間並不是常數級,所以想到非遞迴自底向上的解法。

題解一:(遞迴)

# definition for singly-linked list.

# class listnode:

# def __init__(self, x):

# self.val = x

# self.next = none

class

solution

:def

sortlist

(self, head: listnode)

-> listnode:

#思路:歸併排序——遞迴實現

ifnot head or

not head.

next

:return head

slow ,fast = head, head.

next

while fast and fast.

next

: slow = slow.

next

fast = fast.

next

.next

mid = slow.

next

slow.

next

=none

left, right = self.sortlist(head)

, self.sortlist(mid)

h = res = listnode(0)

#使用乙個頭結點

while left and right:

if left.val < right.val:

h.next

= left

left = left.

next

else

: h.

next

= right

right = right.

next

h = h.

next

h.next

= left if left else right

return res.

next

題解一結果:

題解二:(非遞迴)

參考題解二結果:

148 排序鍊錶

根據演算法題目要求,看出主要考察排序演算法中的歸併排序,那歸併排序的思想類似於分治。簡單描述為 第一步 遞迴,找中點,切割鍊錶 第二步 對每個子鍊錶操作 第三步 把排序好的子鍊錶一步步合併 class solution 遞迴地切割表 直達最後表只有乙個或者沒有乙個節點 再進行合併 listnode ...

148 排序鍊錶

自己做鍊錶的題很容易弄錯,感覺對鍊錶太不熟悉了。需要加強對鍊錶的練習。這種鍊錶題有時感覺思路很簡單,但是在寫 的過程中會發現處理起來要十分的細心。下面 記錄兩種實現方法 都是別人實現的方法 第一種方法 裡注釋掉的部分 不滿足題目要求 1 設定快慢指標分割鍊錶,遞迴 2 對分割後的鍊錶進行排序,合併兩...

148 排序鍊錶

在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。示例 1 示例 2 歸併排序 指的是將兩個已經排序的序列合併成乙個序列的操作,因此採用分治法解決該問題。分治法關鍵有兩點 1.分割 把當前序列平均分割成兩半 2.合併 在保持元素順序的同時將上一步得到的子串行合併到一起 bott...