利用歸併排序的思想,不過這裡排序的不是列表,是乙個鍊錶。
具體**如下:
# 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...