排序链表
问题
给你链表的头结点 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 = []
输出:[]
链接:https://leetcode-cn.com/problems/sort-list
解答
完成 进阶 要求 😁
归并排序 + 链表
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def sortList(self, head: ListNode) -> ListNode:
if not head or not head.next:
return head
'''
分
'''
slow, fast = head, head.next
while fast and fast.next:
fast = fast.next.next
slow = slow.next
# 切割
mid, slow.next = slow.next, None
left = self.sortList(head)
right = self.sortList(mid)
'''
合
'''
res = dot = ListNode(0)
while left and right:
if left.val>right.val:
dot.next = right
right = right.next
else:
dot.next = left
left = left.next
dot = dot.next
if left:
dot.next = left
else:
dot.next = right
return res.next
一点点感悟
看下面这段代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def sortList(self, head: ListNode) -> ListNode:
if not head or not head.next:
return head
'''
分
'''
slow, fast = head, head.next
while fast and fast.next:
fast = fast.next.next
slow = slow.next
# 切割
mid, slow.next = slow.next, None
left = self.sortList(head)
right = self.sortList(mid)
'''
合
'''
res = dot = ListNode(0)
while left and right:
if left.val>right.val:
dot.next = ListNode(right.val)
right = right.next
else:
dot.next = ListNode(left.val)
left = left.next
dot = dot.next
if left:
dot.next = left
else:
dot.next = right
return res.next
可以看出 new 一个 ListNode 十分消耗时间 🙅