在 o(n log n) 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。
示例 1:
輸入: 4->2->1->3
輸出: 1->2->3->4
示例 2:
輸入: -1->5->3->4->0
輸出: -1->0->3->4->5
這個題需要用到歸併排序,歸併排序有兩個過程,乙個是把序列分開,乙個是把序列合併,這裡需要用到兩個函式,使用遞迴來進行程式設計,每一次遞迴都是分開序列和合併序列一起操作。對於歸併排序不清楚的可以維基百科搜尋一下,看一下**,就會清楚很多。
c++源**:
/**
* definition for singly-linked list.
* struct listnode
* };
*/class
solution
pre-
>next =
null
;return
merge
(sortlist
(head)
,sortlist
(slow));
} listnode*
merge
(listnode* left, listnode* right)
else
cur = cur-
>next;}if
(left) cur-
>next = left;
if(right) cur-
>next = right;
return dummy-
>next;}}
;
python3源**:
# definition for singly-linked list.
# class listnode:
# def __init__(self, x):
# self.val = x
# self.next = none
class
solution
:def
sortlist
(self, head: listnode)
-> listnode:
if head==
none
or head.
next
==none
:return head
slow = fast = pre = head
while fast and fast.
next
: pre = slow
slow = slow.
next
fast = fast.
next
.next
pre.
next
=none
return self.merge(self.sortlist(head)
, self.sortlist(slow)
)def
merge
(self, left, right)
:if left==
none
:return right
if right==
none
:return left
if left.val < right.val:
left.
next
= self.merge(left.
next
, right)
return left
else
: right.
next
= self.merge(left, right.
next
)return right
LeetCode騰訊50題 148排序鍊錶
請注意!主要用來自己馬克自己的筆記,不是最優解!不是最優解!不是最優解!請不要噴我。關鍵點 題目要求在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。思路 o nlogn 快排 歸併 於是決定 使用歸併排序演算法對鍊錶進行排序。順便複習下各類排序演算法的時間 空間複雜度。演算法...
20 11 21 leetcode148 鍊錶排序
題意 要求以o nlogn 的複雜度給乙個鍊錶排序 分析 昨天那道題的公升級版,這裡用的是歸併排序的思想,自頂向下的排序,從一開始完整的鍊錶不斷的每次分成兩段,分到每段只有乙個結點為止,再一點點的合併,要注意的是sortlist的函式是前閉後開的。class solution listnode so...
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在陣列儲存下的歸併排序,需要借出輔助空間完成,而鍊錶儲存的歸併排序,不需要借助輔助空間,直接在原來的鍊錶上進行操作,...