在 O(n log n) 時間複雜度和常數級空間複雜度下,對鏈表進行排序。
示例 1:
輸入: 4->2->1->3
輸出: 1->2->3->4
基於遞歸的歸併排序方法
思路:1.爲什麼要用遞歸?2.遞歸的出口是什麼?
答:1.遞歸的目的是要把鏈表不停的分裂。2.分裂成左右只剩小於等於1個結點,並返回該結點(遞歸出口)。
接着對這左右兩個結點進行排序,排序過後返回。
# 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:
#1.遞歸出口
if not head or not head.next:
return head
#2.分裂鏈表爲左右兩個部分
slow, fast = head, head.next
while fast and fast.next:
fast, slow = fast.next.next, slow.next
mid, slow.next = slow.next, None
left, right = self.sortList(head), self.sortList(mid)
#3.排序左右兩個列表
h = res = ListNode(0)
while left and right:
if left.val < right.val:
h.next, left = left, left.next
else:
h.next, right = right, right.next
h = h.next
h.next = left if left else right
return res.next