給定乙個單鏈表,請使用快速排序演算法對其排序
要求:期望平均時間複雜度為o(nlogn)
,期望額外空間複雜度為o(logn)
思考題:如果只能改變鍊錶結構,不能修改每個節點的val
值該如何做呢
資料範圍
鍊錶中的所有數大小均在int
範圍內,鍊錶長度在[0, 10000]
輸入樣例:
[5, 3, 2]
輸出樣例:[2, 3, 5]
首先我們要思考快排的思想
快排就是選定乙個目標值,將比目標值小的都放在左邊,比目標值大的都放在右邊,然後遞迴處理左邊和右邊,最後將三者(還有等於目標值的可能)合併,那在鍊錶中如何實現快排呢
很簡單,我們要定義三個鍊錶,分別代表left、mid、right
,我們設定乙個目標值,假設為int val = head->val
,通過遍歷原鍊錶,我們將比val
小的放在left
後,將比val
大的放在right
後,相等的放在mid
後,然後遞迴處理left
和right
,最後將三者連線即可
這裡需要注意幾個細節,因為三個鍊錶的表頭指標我們後面會用到,所以我們需要乙個變數來記錄每個鍊錶尾節點的指標:ltail、mtail、rtail
,通過這三個指標,我們可以實現向鍊錶尾插入資料;在遍歷鍊錶結束後,要將三個尾指標指空,否則系統無法判斷鍊錶是否結束了,下面是**
class solution
ltail->next = rtail->next = mtail->next =
null
; left->next =
quicksortlist
(left->next)
; right->next =
quicksortlist
(right->next)
;auto lh = left;
while
(lh->next) lh = lh->next;
lh->next = mid->next;
while
(lh->next) lh = lh->next;
lh->next = right->next;
return left->next;}}
;
開心IT面試題 單鏈表排序 反轉
一 單鏈表排序 仿照基於陣列的氣泡排序演算法 node sorting linklist node node node result int temp 0 int len length linklist node result node for int j 0 j len j result resu...
面試題 單鏈表反轉
問題 定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。一 非遞迴演算法 假設有鍊錶a b c d e f g。在反轉鍊錶過程中的某一階段,其鍊錶指標指向為 a b c d e f g。也就是說在結點d之前的所有結點都已經反轉,而結點d後面的結點e開始的所有結點都沒有反轉。這樣...
單鏈表的面試題
自定義標頭檔案部分 void deletenottail pnode pos 刪除乙個無頭單鏈表的非尾節點 void insertnothead pnode phead,pnode pos,datatype data 在無頭單鏈表的乙個非頭節點前插入乙個節點 void josephcircle pn...