330 字
2 分钟
LeetCode-148.排序链表

链表#

148. 排序链表

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


示例 1:

img

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

示例 2:

img

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

示例 3:

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

归并排序的解法

很神奇

思路:这个问题就是用归并排序解决的,这里可以分为两部分1.分解 和 2. 合成。

  1. 分解为一个个链表,依靠快慢指针和递归,直到触发if head == nil || head.Next == nil {}返回一个链表
  2. 就是 21. 合并两个有序链表 的写法

Ps: 这个代码的递归的逻辑很像中间件的洋葱模型,返回一个链表后,再不断地return mergeTwoLists(left, right)

/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func sortList(head *ListNode) *ListNode {
if head == nil || head.Next == nil {
return head
}
slow, fast := head, head.Next
for fast != nil && fast.Next != nil {
slow = slow.Next
fast = fast.Next.Next
}
mid := slow.Next
slow.Next = nil
left := sortList(head)
right := sortList(mid)
return mergeTwoLists(left, right)
}
func mergeTwoLists(list1, list2 *ListNode) *ListNode {
dummy := &ListNode{}
cur := dummy
for list1 != nil && list2 != nil {
if list1.Val < list2.Val {
cur.Next = list1
list1 = list1.Next
} else {
cur.Next = list2
list2 = list2.Next
}
cur = cur.Next
}
if list1 != nil {
cur.Next = list1
} else {
cur.Next = list2
}
return dummy.Next
}
LeetCode-148.排序链表
https://sheep44044.github.io/posts/算法/链表/leetcode-148排序链表/
作者
sheep44044
发布于
2026-03-12
许可协议
CC BY-NC-SA 4.0