题目
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
示例 1:

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

输入:head = [-1,5,3,4,0] 输出:[-1,0,3,4,5]
示例 3:
输入:head = [] 输出:[]
提示:
- 链表中节点的数目在范围
[0, 5 * 104]内 -105 <= Node.val <= 105
思路
用归并排序解决
1.拆分链表
(1)找中点——快慢指针找中点,但需要注意!由于存在奇偶长度的链表,所以这个中点应该是正中或者偏左一个(否则会存在死循环)
(2)分!(让中点的next = None即可)
2.按序合并(比大小即可)
代码
# 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: Optional[ListNode]) -> Optional[ListNode]:
if not head or not head.next:
return head
fast, slow = head.next, head # 这里一定是fast比slow多一个,否则后面拆分链表后会出现死循环~
while fast and fast.next: # 快慢指针找中点
fast = fast.next.next
slow = slow.next
mid, slow.next = slow.next, None
left, right = self.sortList(head), self.sortList(mid) # 不断拆分
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
1792

被折叠的 条评论
为什么被折叠?



