在 o(n log n) 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。
示例 1:
輸入: 4->2->1->3
輸出: 1->2->3->4
示例 2:
輸入: -1->5->3->4->0
輸出: -1->0->3->4->5
結果:
**:
class
solution
//遞迴結束
if(head.next == null)
//快慢指標找中間節點
listnode s = head;
listnode f = head;
while
(f.next != null && f.next.next != null)
//把鍊錶從中間斷開
listnode tail = s;
s = s.next;
tail.next = null;
//對左鍊錶遞迴並返回頭指標
listnode l =
sortlist
(head)
;//對右鍊錶遞迴並返回頭指標
listnode r =
sortlist
(s);
return
merge
(l, r);}
//合併鍊錶
public listnode merge
(listnode left, listnode right)
else
}
cur.next = left == null ? right : left;
return pre.next;
}}
思路:歸併排序。還涉及了找鍊錶的中間節點並斷開鍊錶,這一步可以用快慢指標獲得,這時歸併排序的分。歸併的和則是將兩個鍊錶合成一條,建立一條新的鍊錶cur,比較兩條煉表頭節點大小,將小的節點加入到新的鍊錶cur,直到其中一條鍊錶空了,再把另一條鍊錶加入新鍊錶cur的尾部即可,這個在前幾天做過。 148 排序鍊錶
根據演算法題目要求,看出主要考察排序演算法中的歸併排序,那歸併排序的思想類似於分治。簡單描述為 第一步 遞迴,找中點,切割鍊錶 第二步 對每個子鍊錶操作 第三步 把排序好的子鍊錶一步步合併 class solution 遞迴地切割表 直達最後表只有乙個或者沒有乙個節點 再進行合併 listnode ...
148 排序鍊錶
自己做鍊錶的題很容易弄錯,感覺對鍊錶太不熟悉了。需要加強對鍊錶的練習。這種鍊錶題有時感覺思路很簡單,但是在寫 的過程中會發現處理起來要十分的細心。下面 記錄兩種實現方法 都是別人實現的方法 第一種方法 裡注釋掉的部分 不滿足題目要求 1 設定快慢指標分割鍊錶,遞迴 2 對分割後的鍊錶進行排序,合併兩...
148 排序鍊錶
難度 中等 題目描述 思路總結 題目要求時間複雜度o nlog n 想到二分 想到歸併。歸併遞迴解法,額外空間並不是常數級,所以想到非遞迴自底向上的解法。題解一 遞迴 definition for singly linked list.class listnode def init self,x s...