AcWing 1451 單鏈表快速排序

2021-10-05 20:17:34 字數 2001 閱讀 5131

採用快排實現鍊錶的排序,比較難處理的地方是如何實現分隔,由於鍊錶只能從前往後遍歷不能從後往前遍歷,那麼

常規的分隔方法:

常規的分隔方法不適用,另外一種分隔方法:

鍊錶實現起來比較困難,涉及到交換兩個節點

如何交換鍊錶的兩個節點:

交換完兩個節點後需要將鍊錶按照基準元素的位置分成兩部分,分別進行快排,快排結束還需要將這兩部分進行合併

/**

* definition for singly-linked list.

* struct listnode

* };

*/class

solution

private

: listnode*

qsort

(listnode* phead)

else

pleft = pleft-

>next;

} listnode *nhead =

newlistnode(0

);if(phead != pivot)

else

//merge

listnode * p1 = phead-

>next,

* p2 = nhead-

>next,

*h =

newlistnode(-

1),*p = h;

while

(p1 && p2)

else

p = p-

>next;

}while

(p1)

while

(p2)

return h;

}void

swap

(listnode* p1, listnode *p2)

else}}

;

拆分完分別對左右拆分好的小於和大於基準元素的鍊錶進行遞迴,最終再將三個鍊錶合併

/**

* definition for singly-linked list.

* struct listnode

* };

*/class

solution

private

: listnode*

gettail

(listnode* head)

return p;

} listnode*

quicksort

(listnode* head)

else

if(p-

>val == head-

>val)

else

p = p-

>next;

} left-

>next =

null

; mid-

>next =

null

; right-

>next =

null

;//遞迴,說明:設定了頭節點避免了分割後一端為空的時候需要特別處理的步驟

lhead-

>next =

quicksort

(lhead-

>next)

; rhead-

>next =

quicksort

(rhead-

>next)

;//合併

gettail

(lhead)

->next = mhead-

>next;

gettail

(lhead)

->next = rhead-

>next;

return lhead-

>next;}}

;

1451 單鏈表快速排序

給定乙個單鏈表,請使用快速排序演算法對其排序。要求 期望平均時間複雜度為 o nlogn 期望額外空間複雜度為 o logn 思考題 如果只能改變鍊錶結構,不能修改每個節點的val值該如何做呢?資料範圍 鍊錶中的所有數大小均在 int 範圍內,鍊錶長度在 0,10000 輸入樣例 5,3,2 輸出樣...

AcWing 826 單鏈表

實現乙個單鏈表,鍊錶初始為空,支援三種操作 1 向煉表頭插入乙個數 2 刪除第k個插入的數後面的數 3 在第k個插入的數後插入乙個數 現在要對該鍊錶進行m次操作,進行完所有操作後,從頭到尾輸出整個鍊錶。注意 題目中第k個插入的數並不是指當前鍊錶的第k個數。例如操作過程中一共插入了n個數,則按照插入的...

AcWing 826 單鏈表

實現乙個單鏈表,鍊錶初始為空,支援三種操作 1 向煉表頭插入乙個數 2 刪除第k個插入的數後面的數 3 在第k個插入的數後插入乙個數 現在要對該鍊錶進行m次操作,進行完所有操作後,從頭到尾輸出整個鍊錶。注意 題目中第k個插入的數並不是指當前鍊錶的第k個數。例如操作過程中一共插入了n個數,則按照插入的...