採用快排實現鍊錶的排序,比較難處理的地方是如何實現分隔,由於鍊錶只能從前往後遍歷不能從後往前遍歷,那麼
常規的分隔方法:
常規的分隔方法不適用,另外一種分隔方法:
鍊錶實現起來比較困難,涉及到交換兩個節點
如何交換鍊錶的兩個節點:
交換完兩個節點後需要將鍊錶按照基準元素的位置分成兩部分,分別進行快排,快排結束還需要將這兩部分進行合併
/**
* 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個數,則按照插入的...