148 排序鍊錶(歸併法)

2021-10-10 17:21:40 字數 1593 閱讀 1422

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

高階:你可以在 o

(n log n) 時間複雜度和常數級空間複雜度下,對鍊錶進行排序嗎?

示例 1:

輸入:head =[4

,2,1

,3]輸出:[1,

2,3,

4]示例 2:

輸入:head =[-

1,5,

3,4,

0]輸出:[-1

,0,3

,4,5

]示例 3:

輸入:head =

輸出:

鍊錶中節點的數目在範圍 [0,

5*104] 內

-105

<= node.val <=

105/

/leetcode-cn.com/problems/sort-list

整個題目可以簡述為,乙個單鏈表想要在時間複雜度為o(n

logn

)o(n log n)

o(nlog

n)重完成

對於這樣的題目原來的插入排序肯定不符合題目要求了,在單鏈表排序中,一般推薦歸併排序,有自頂向下和自底向上兩種策略,我採用的是自定向上的方法

對於自頂向下的策略,主要是先將單鏈表分段(一般取單鏈表的中心點,分成左右兩段),分成子段後,排序,合併成最後乙個完整的單鏈表

/**

* definition for singly-linked list.

* struct listnode

* listnode(int x) : val(x), next(nullptr) {}

* listnode(int x, listnode *next) : val(x), next(next) {}

* };

*/class

solution

listnode*

sortlist

(listnode* head,listnode* tail)

if(head-

>next==tail)

listnode* slow = head,

*fast = fast;

while

(fast!=tail)

} listnode* mid = slow;

return

merge

(sortlist

(head,mid)

,sortlist

(mid,tail));

} listnode*

merge

(listnode* head1, listnode* head2)

else

temp = temp-

>next;}if

(temp1!=

nullptr)if

(temp2!=

nullptr

)return dummy-

>next;}}

;

148 排序鍊錶 歸併排序

難度 中等 題目描述 解題思路 148.排序鍊錶 2020 8 13 1對鍊錶進行歸併排序 1 快慢指標找中間節點 2 遞迴呼叫mergesort 3 合併有序鍊錶 public listnode sortlist listnode head public listnode listmergesor...

148 排序鍊錶

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

148 排序鍊錶

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