自己做鍊錶的題很容易弄錯,感覺對鍊錶太不熟悉了。需要加強對鍊錶的練習。
這種鍊錶題有時感覺思路很簡單,但是在寫**的過程中會發現處理起來要十分的細心。
下面**記錄兩種實現方法(都是別人實現的方法)。
第一種方法(**裡注釋掉的部分):不滿足題目要求
1、設定快慢指標分割鍊錶,遞迴;
2、對分割後的鍊錶進行排序,合併兩個鍊錶。
/**
* definition for singly-linked list.
* struct listnode
* };
*/class
solution
else
p=p-
>next;}if
(l1) p-
>next=l1;
if(l2) p-
>next=l2;
return dummy-
>next;}
listnode*
sortlist
(listnode* head)
pre-
>next=
null
; head=
sortlist
(head)
; slow=
sortlist
(slow)
;return
mergetwolists
(head,slow)
;/**
mapnums;
listnode* p = head;
while (p)
p = head;
map::iterator iter = nums.begin();
while (iter != nums.end())
iter++;
}return head;
**/}}
;
148 排序鍊錶
根據演算法題目要求,看出主要考察排序演算法中的歸併排序,那歸併排序的思想類似於分治。簡單描述為 第一步 遞迴,找中點,切割鍊錶 第二步 對每個子鍊錶操作 第三步 把排序好的子鍊錶一步步合併 class solution 遞迴地切割表 直達最後表只有乙個或者沒有乙個節點 再進行合併 listnode ...
148 排序鍊錶
難度 中等 題目描述 思路總結 題目要求時間複雜度o nlog n 想到二分 想到歸併。歸併遞迴解法,額外空間並不是常數級,所以想到非遞迴自底向上的解法。題解一 遞迴 definition for singly linked list.class listnode def init self,x s...
148 排序鍊錶
在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。示例 1 示例 2 歸併排序 指的是將兩個已經排序的序列合併成乙個序列的操作,因此採用分治法解決該問題。分治法關鍵有兩點 1.分割 把當前序列平均分割成兩半 2.合併 在保持元素順序的同時將上一步得到的子串行合併到一起 bott...