方法:參考
因為有時間複雜度要求o(nlogn) , 所以考慮歸併排序。歸併排順是不斷的把待排的部分分成兩部分。
技巧:使用快慢指標,慢指標每走一步,快指標走兩步。最後結束,剛好慢指標走到中間。
(1)首先判斷元素個數,如果為空或者只有乙個,直接返回。
(2)定義兩個快慢指標,和乙個pre指標,指向第一部分的最後乙個元素。
(3)第一遍遍歷結束後,pre->next,這樣第一部分就完整了,然後merge排序,兩部分。注意這裡遞迴呼叫,sortlist不斷地切分。
(4)merge排序有兩個鍊錶;首先建立虛擬頭節點,和cur
(5)如果兩部分都存在,那麼直接比較,cur指向小的鍊錶,然後更新小的,如果有乙個不存在,那麼直接讓cur指向存在的鍊錶。
class
solution
pre-
>next =
null
;return
merge
(sortlist
(head)
,sortlist
(slow));
// 迭代操作
} listnode*
merge
(listnode*l1, listnode*l2)
else
cur = cur-
>next;}if
(l1) cur-
>next = l1;
if(l2) cur-
>next = l2;
listnode* resnode = dummynode-
>next;
delete dummynode;
return resnode;}}
;
leetcode 148 鍊錶排序
題目 用nlog n 的時間複雜度,實現鍊錶的排序 思路 列表或者陣列可以直接用歸併排序來做,但是鍊錶沒法做,因為鍊錶只有順序關係,很難定位到乙個元素 中點 在這裡需要對歸併排序做一些改動 tip 如何定位到鍊錶中點?雙指標法 雙指標法。沒錯,就是之前判斷鍊錶有環的方法。乙個指標走一步,乙個指標走兩...
鍊錶 排序鍊錶(leetcode 148
在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。以下解析來自於 常見排序方法有很多,插入排序,選擇排序,堆排序,快速排序,氣泡排序,歸併排序,桶排序等等。它們的時間複雜度不盡相同,而這裡題目限定了時間必須為o nlgn 符合要求只有快速排序,歸併排序,堆排序 所以說,本題 l...
Leetcode 148 排序鍊錶
在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。示例 1 輸入 4 2 1 3 輸出 1 2 3 4示例 2 輸入 1 5 3 4 0 輸出 1 0 3 4 5在陣列儲存下的歸併排序,需要借出輔助空間完成,而鍊錶儲存的歸併排序,不需要借助輔助空間,直接在原來的鍊錶上進行操作,...