leet148 排序鍊錶

2021-10-01 06:12:18 字數 1988 閱讀 9866

}自底向上歸併

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...