要求
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
进阶:
- 你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?
示例 1:
输入:head = [4,2,1,3]
输出:[1,2,3,4]
示例 2:
输入: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
重点问题
解题思路:
我们使用递归排序,1. 找中点,把链表一分为二 2. 递归处理左右半边 3. 合并排好序的部分,这个题首先值得吸收的思想就是在链表中找中点,使用的是快慢指针的方式,快指针两步,慢指针一步,然后是我们递归处理左右两个子序列,然后我们在将处理好的段有序的链表进行合并,注意递归的使用,值得学习。