该题解使用了自底向上的归并排序算法。首先通过 dummy 节点简化边界情况处理。然后通过 get_length 函数获取链表长度。在归并排序的每一轮中,将链表拆分成若干个长度为 i 的子链表(最后一个子链表长度可能小于 i),并对每对相邻的子链表进行合并。通过 cut 函数将链表切成两半,再通过 merge 函数合并有序链表。不断将 i 乘以 2,对越来越长的有序子链表进行归并,直到整个链表有序。
时间复杂度: O(n * log n)
空间复杂度: O(1)
# 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 head is None or head.next is None:
return head
# 使用 dummy 节点简化边界情况处理
dummy = ListNode(next=head)
def get_length(head):
p = head
length = 0
while p:
p = p.next
length += 1
return length
# 将链表切分成两个子链表
def cut(head, n):
p = head
while p and n - 1 > 0:
p = p.next
n -= 1
if p is None:
return
new_head = p.next
p.next = None
return new_head
# 合并两个有序链表
def merge(l1, l2):
dummy = ListNode(0)
p = dummy
while l1 and l2:
if l1.val < l2.val:
p.next = l1
l1 = l1.next
else:
p.next = l2
l2 = l2.next
p = p.next
if l1:
p.next = l1
if l2:
p.next = l2
return dummy.next
# 获取链表长度
length = get_length(head)
i = 1
# 自底向上进行归并排序
while i < length:
tail = dummy
cur = dummy.next
while cur:
left = cur
right = cut(left, i)
cur = cut(right, i)
tail.next = merge(left, right)
while tail.next:
tail = tail.next
i *= 2
return dummy.next