LeetCode演算法題148 排序鍊錶解析

2021-09-11 18:58:38 字數 1962 閱讀 8618

在 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在陣列儲存下的歸併排序,需要借出輔助空間完成,而鍊錶儲存的歸併排序,不需要借助輔助空間,直接在原來的鍊錶上進行操作,...