leetcode_148 排序链表

145 阅读1分钟

要求

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。

进阶:

  • 你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?

示例 1:

image.png

输入:head = [4,2,1,3]
输出:[1,2,3,4]

示例 2:

image.png

输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]

示例 3:

输入:head = []
输出:[]

核心代码

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
        
class Solution:
    def sortList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if not head or not head.next:
            return head
        pre,slow,fast = head,head,head
        while fast and fast.next:
            pre = slow
            slow = slow.next
            fast = fast.next.next
        
        pre.next = None
        left,right = self.sortList(head),self.sortList(slow)
        return self.merge(left,right)
    
    def merge(self,l1,l2):
        if not l1:
            return l2
        if not l2:
            return l1
        if l1.val < l2.val:
            head = ListNode(l1.val)
            head.next = self.merge(l1.next,l2)
        else:
            head = ListNode(l2.val)
            head.next = self.merge(l1,l2.next)
        return head

image.png

重点问题

解题思路:

我们使用递归排序,1. 找中点,把链表一分为二 2. 递归处理左右半边 3. 合并排好序的部分,这个题首先值得吸收的思想就是在链表中找中点,使用的是快慢指针的方式,快指针两步,慢指针一步,然后是我们递归处理左右两个子序列,然后我们在将处理好的段有序的链表进行合并,注意递归的使用,值得学习。