給定乙個單鏈表,請使用快速排序演算法對其排序。
要求:期望平均時間複雜度為 o(nlogn),期望額外空間複雜度為 o(logn)。
思考題: 如果只能改變鍊錶結構,不能修改每個節點的val值該如何做呢?
資料範圍
鍊錶中的所有數大小均在 int 範圍內,鍊錶長度在 [0,10000]。
輸入樣例:
[5, 3, 2]輸出樣例:
[2, 3, 5]
#include
using
namespace std;
class
solution
return head;
} listnode*
quicksortlist
(listnode* head)
//得到三個鍊錶,遞迴左邊和右邊鍊錶
left-
>next = mid-
>next = right-
>next =
null
;//各個鍊錶尾部置null
//只需遍歷左區間與右區間
lhead-
>next =
quicksortlist
(lhead-
>next)
; rhead-
>next =
quicksortlist
(rhead-
>next)
;//鍊錶拼接
gettail
(lhead)
->next = mhead-
>next;
//拼接左邊鍊錶與中間鍊錶
gettail
(lhead)
->next = rhead-
>next;
//拼接前面拼接好的鍊錶與右邊鍊錶
//返回的煉表頭
auto re = lhead-
>next;
//記憶體**
delete lhead;
delete mhead;
delete rhead;
return re;}}
;
AcWing 1451 單鏈表快速排序
採用快排實現鍊錶的排序,比較難處理的地方是如何實現分隔,由於鍊錶只能從前往後遍歷不能從後往前遍歷,那麼 常規的分隔方法 常規的分隔方法不適用,另外一種分隔方法 鍊錶實現起來比較困難,涉及到交換兩個節點 如何交換鍊錶的兩個節點 交換完兩個節點後需要將鍊錶按照基準元素的位置分成兩部分,分別進行快排,快排...
單鏈表快速排序
今天在學習 程式設計師使用演算法 時,看到了單鏈表快排序這一節。初看時感覺程式有很大的問題,但是細細品味之後卻發現程式設計的極為巧妙,同時又深感自己c語言指標知識之不牢固,特別是指標的指標方面的知識。單鏈表的快排序和陣列的快排序基本思想相同,同樣是基於劃分,但是又有很大的不同 單鏈表不支援基於下標的...
單鏈表快速排序
今天在學習 程式設計師使用演算法 時,看到了單鏈表快排序這一節。初看時感覺程式有很大的問題,但是細細品味之後卻發現程式設計的極為巧妙,同時又深感自己c語言指標知識之不牢固,特別是指標的指標方面的知識。單鏈表的快排序和陣列的快排序基本思想相同,同樣是基於劃分,但是又有很大的不同 單鏈表不支援基於下標的...