LeetCode 148 排序鍊錶

2021-10-02 09:49:51 字數 1105 閱讀 1354

示例 1:

輸入: 4->2->1->3

輸出: 1->2->3->4

示例 2:

輸入: -1->5->3->4->0

輸出: -1->0->3->4->5

題中給的時間複雜度讓你進行排序,基本都可以想到歸併排序,但本題目複雜的地方就在於是鍊錶資料,所以如何進行鍊錶的分開和合併就是難點

1、使用自下而上的歸併排序使用二路歸併就是先進行兩個合併,之後四個合併,下來八個合併,所以合併的步數長就是step*=2

2、進行分割的cut函式

cut(pos, step)

將鍊錶 pos切掉前 step個節點,並返回後半部分的煉表頭,目的就是進行斷鏈

3、merge函式

歸併的merge函式基本都是一樣的,但是本題使用了dummyhead這個網上稱作的乙個資料結構,其實它存在的目的就是因為本題head存有資料,不能直接當頭結點使用,有了dummyhead這個空指標之後,既可以把dummyhead當做乙個新的鍊錶使用,也可以為合併後的鍊錶提供乙個頭結點

duummyhead參考資料

(建議複製到所用編輯器,系統給的這個顏色注釋看不清)

class

solution

for(

int step =

1; step < length; step*=2

)//也可以用左賦值語句 step <<= 1

}return dummyhead.next;

} listnode *

cut(listnode *head,

int n)

listnode *

merge

(listnode *left, listnode *right)

else

//right的值小就進行插入

} p-

>next = left ? left :right;

//直接把剩餘的鍊錶插入

return dummyhead.next;}}

;

Leetcode 148 排序鍊錶

在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。示例 1 輸入 4 2 1 3 輸出 1 2 3 4示例 2 輸入 1 5 3 4 0 輸出 1 0 3 4 5在陣列儲存下的歸併排序,需要借出輔助空間完成,而鍊錶儲存的歸併排序,不需要借助輔助空間,直接在原來的鍊錶上進行操作,...

LeetCode 148 排序鍊錶

在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。示例 1 輸入 4 2 1 3輸出 1 2 3 4示例 2 輸入 1 5 3 4 0輸出 1 0 3 4 5歸併這裡我感覺有點不符合題意 不符合常數空間 如果是快排的話呢,交換節點還是很麻煩的,所以快排交換值了 癱.jpg cl...

leetcode148 排序鍊錶

在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。示例 1 輸入 4 2 1 3 輸出 1 2 3 4 示例 2 輸入 1 5 3 4 0 輸出 1 0 3 4 5 看到題目就知道要二分,這裡用的是遞迴版歸併 definition for singly linked list....