}自底向上歸併
public listnode sortlist
(listnode head)
// 這裡設定 64 ,是乙個綽綽有餘的數字,可以滿足結點數量為 2^64 這麼多的單鏈表的排序
listnode[
] counter =
newlistnode[64
];listnode curnode = head;
// 遍歷到的最大的 counter 陣列的索引
int maxindex =0;
while
(curnode != null)
// 遇到了空,就把 carrynode 放在陣列的這個位置上
counter[i]
= carrynode;
// 記錄最多使用到 counter 陣列的第幾位,最後合併的時候要用上
if(i > maxindex)
}// 遍歷整個 count 陣列,將它們全部歸併,這個操作就和歸併 n 個有序單鏈表是一樣的了,我們這裡採用兩兩歸併
// 還可以採用 leetcode 第 23 題的辦法完成這一步
// 參考:
listnode res = null;
for(
int i =
0; i <= maxindex; i++)}
return res;
}/**
* 歸併兩個已經排好序的單鏈表,是我們非常熟悉的操作了,可以遞迴完成,也可以穿針引線,這裡我們遞迴完成
** @param l1 順序存放的單鏈表1
* @param l2 順序存放的單鏈表2
* @return 合併以後的單鏈表
*/private listnode mergeoftwosortedlistnode
(listnode l1, listnode l2)
if(l2 == null)
if(l1.val < l2.val)
else
}public
static
void
main
(string[
] args)
; listnode head =
newlistnode
(nums)
; solution2 solution2 =
newsolution2()
; listnode sortlist = solution2.
sortlist
(head)
; system.out.
println
(sortlist);}
}
148 排序鍊錶
根據演算法題目要求,看出主要考察排序演算法中的歸併排序,那歸併排序的思想類似於分治。簡單描述為 第一步 遞迴,找中點,切割鍊錶 第二步 對每個子鍊錶操作 第三步 把排序好的子鍊錶一步步合併 class solution 遞迴地切割表 直達最後表只有乙個或者沒有乙個節點 再進行合併 listnode ...
148 排序鍊錶
自己做鍊錶的題很容易弄錯,感覺對鍊錶太不熟悉了。需要加強對鍊錶的練習。這種鍊錶題有時感覺思路很簡單,但是在寫 的過程中會發現處理起來要十分的細心。下面 記錄兩種實現方法 都是別人實現的方法 第一種方法 裡注釋掉的部分 不滿足題目要求 1 設定快慢指標分割鍊錶,遞迴 2 對分割後的鍊錶進行排序,合併兩...
148 排序鍊錶
難度 中等 題目描述 思路總結 題目要求時間複雜度o nlog n 想到二分 想到歸併。歸併遞迴解法,額外空間並不是常數級,所以想到非遞迴自底向上的解法。題解一 遞迴 definition for singly linked list.class listnode def init self,x s...