給你鍊錶的頭結點 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 對分割後的鍊錶進行排序,合併兩...