面試題 單鏈表快速排序

2021-10-04 00:11:30 字數 1331 閱讀 1192

給定乙個單鏈表,請使用快速排序演算法對其排序

要求:期望平均時間複雜度為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後,然後遞迴處理leftright,最後將三者連線即可

​ 這裡需要注意幾個細節,因為三個鍊錶的表頭指標我們後面會用到,所以我們需要乙個變數來記錄每個鍊錶尾節點的指標: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...