148 排序鍊錶

2021-10-03 09:51:00 字數 1769 閱讀 9135

在 o(n log n) 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。

示例 1:

示例 2:

歸併排序:指的是將兩個已經排序的序列合併成乙個序列的操作,因此採用分治法解決該問題。

分治法關鍵有兩點:

1.分割:把當前序列平均分割成兩半;

2.合併:在保持元素順序的同時將上一步得到的子串行合併到一起;

bottom-to-up 的歸併思路是這樣的:

先兩個兩個的 merge,完成一趟後,再 4 個4個的 merge,直到結束。舉個簡單的例[4,3,1,7,8,9,2,11,5,6]

step=1: (3->4)->(1->7)->(8->9)->(2->11)->(5->6)

step=2: (1->3->4->7)->(2->8->9->11)->(5->6)

step=4: (1->2->3->4->7->8->9->11)->5->6

step=8: (1->2->3->4->5->6->7->8->9->11)

/**

* definition for singly-linked list.

* struct listnode

* };

*/class

solution

//獲取鍊錶長度

int len =

getlen

(head)

; listnode* dummyhead =

newlistnode(0

);dummyhead-

>next = head;

for(

int step =

1;step < len; step <<=1)

}}return dummyhead-

>next;

} listnode*

merge

(listnode* l1, listnode* l2)

else

head = head-

>next;

} head-

>next =

(l1 ==

null

)? l2 : l1;

return dummyhead-

>next;

}//根據步長分割鍊錶,返回這段鍊錶的後面乙個節點

listnode*

split

(listnode* head,

int step)

for(

int i =

1;head-

>next !=

null

&& i < step;

++i)

listnode* right = head-

>next;

//right指向這段鍊錶的後面乙個節點

head-

>next =

null

;//斷開鍊錶

return right;

}int

getlen

(listnode* head)

return len;}}

;

時間複雜度:o(nlogn)

空間複雜度:o(1)

148 排序鍊錶

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

148 排序鍊錶

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

148 排序鍊錶

難度 中等 題目描述 思路總結 題目要求時間複雜度o nlog n 想到二分 想到歸併。歸併遞迴解法,額外空間並不是常數級,所以想到非遞迴自底向上的解法。題解一 遞迴 definition for singly linked list.class listnode def init self,x s...