148 排序鍊錶

2021-10-14 09:31:16 字數 1559 閱讀 3194

給你鍊錶的頭結點head,請將其按公升序排列並返回排序後的鍊錶

高階:

示例 1:

輸入:head = [4,2,1,3]輸出:[1,2,3,4]
示例 2:

輸入:head = [-1,5,3,4,0]輸出:[-1,0,3,4,5]
示例 3:

輸入:head =輸出:
思路bottom-to-up 的歸併思路是這樣的:先兩個兩個的 merge,完成一趟後,再 4 個4個的 merge,直到結束。舉個簡單的例子:[4,3,1,7,8,9,2,11,5,6].

step=1: (3->4)->(1->7)->(8->9)->(2->11)->(5->6)

step=2: (1->3->4->7)->(2->8->9->11)->(5->6)

step=4: (1->2->3->4->7->8->9->11)->(5->6)

step=8: (1->2->3->4->5->6->7->8->9->11)

煉表裡操作最難掌握的應該就是各種斷鏈啊,然後再掛接啊。在這裡,我們主要用到鍊錶操作的兩個技術:

**實現

public listnode sortlist(listnode head) 

listnode tail = dummyhead;

//每次步長*2

for (int step = 1; step < length; step <<= 1) }}

return dummyhead.next;

}//作用:在step位置斷鏈,並返回後面部分的鏈頭

public listnode cut(listnode head, int step)

//如果鍊錶不夠step長,就返回空

if (head != null) else

}//歸併兩條鍊錶

public listnode merge(listnode l1, listnode l2) else

work = work.next;

}if (l1 != null)

if (l2 != null)

return head.next;

}

148 排序鍊錶

根據演算法題目要求,看出主要考察排序演算法中的歸併排序,那歸併排序的思想類似於分治。簡單描述為 第一步 遞迴,找中點,切割鍊錶 第二步 對每個子鍊錶操作 第三步 把排序好的子鍊錶一步步合併 class solution 遞迴地切割表 直達最後表只有乙個或者沒有乙個節點 再進行合併 listnode ...

148 排序鍊錶

自己做鍊錶的題很容易弄錯,感覺對鍊錶太不熟悉了。需要加強對鍊錶的練習。這種鍊錶題有時感覺思路很簡單,但是在寫 的過程中會發現處理起來要十分的細心。下面 記錄兩種實現方法 都是別人實現的方法 第一種方法 裡注釋掉的部分 不滿足題目要求 1 設定快慢指標分割鍊錶,遞迴 2 對分割後的鍊錶進行排序,合併兩...

148 排序鍊錶

難度 中等 題目描述 思路總結 題目要求時間複雜度o nlog n 想到二分 想到歸併。歸併遞迴解法,額外空間並不是常數級,所以想到非遞迴自底向上的解法。題解一 遞迴 definition for singly linked list.class listnode def init self,x s...