leetcode 排序鍊錶

2021-09-25 09:54:10 字數 1981 閱讀 3576

利用歸併排序的思想,不過這裡排序的不是列表,是乙個鍊錶。

具體**如下:

# definition for singly-linked list.

# class listnode(object):

# def __init__(self, x):

# self.val = x

# self.next = none

class

solution

(object):

defsortlist

(self, head)

:"""

:type head: listnode

:rtype: listnode

"""#merge sort

ifnot head:

return head

ptr = head

count =

0while ptr:

ptr = ptr.

next

count +=

1return self.merge(head, count)

defmerge

(self, head, nums)

:#只有乙個節點

if nums ==1:

return head

#兩個節點的時候排好序,然後返回首節點

if nums ==2:

ptr = head

follow = ptr.

next

if ptr.val > follow.val:

ptr.

next

=none

follow.

next

= ptr

return follow

else

:return ptr

if nums >2:

stride = nums +

1 stride = stride //

2#將鍊錶分成兩段

tmp = head

ptr = head

for i in

range

(stride -1)

: tmp = tmp.

next

second_head = tmp.

next

tmp.

next

=none

ptr1 = self.merge(ptr, stride)

ptr2 = self.merge(second_head, nums - stride)

#將兩段合併並且返回頭節點

if ptr1.val < ptr2.val:

res = ptr1

ptr1 = ptr1.

next

else

: res = ptr2

ptr2 = ptr2.

next

tmp = res

while ptr1 and ptr2:

if ptr1.val < ptr2.val:

tmp.

next

= ptr1

ptr1 = ptr1.

next

tmp = tmp.

next

else

: tmp.

next

= ptr2

ptr2 = ptr2.

next

tmp = tmp.

next

if ptr1:

tmp.

next

= ptr1

if ptr2:

tmp.

next

= ptr2

return res

leetcode 鍊錶排序

對鍊錶排序,用歸併排序。題目要求空間時間複雜度為o nlogn 但是空間複雜度為o 1 1.自己寫的程式,時間複雜度為o nlogn 但是空間複雜度為o n 用快慢指標 分別走2步和1步 找到中間節點。但是最後排序的部分,用複製將排好序的部分貼上會原來鍊錶中,這個方法比較笨,而且增加空間複雜度,並不...

leetcode 鍊錶 排序

思路 使用歸併排序。拆分 合併均採用遞迴方式。public listnode sortlist listnode head pre.next null return merge sortlist head sortlist slow public listnode merge listnode l1...

LeetCode 排序鍊錶

給你鍊錶的頭結點head,請將其按公升序排列並返回排序後的鍊錶。高階 示例 1 輸入 head 4,2,1,3 輸出 1,2,3,4 示例 2 輸入 head 1,5,3,4,0 輸出 1,0,3,4,5 示例 3 輸入 head 輸出 歸併排序 將鍊錶拆分為二 listnode head1 sor...