148. 排序鏈表

在 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


        
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章