LeetCode 148. 排序链表

题目描述

148. 排序链表

image-20220914152526184

image-20220914152533451

思路分析

归并排序

image-20230804154636177

image-20250507190602814

参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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 merge(left, right)
}

// 合并两个有序链表
func merge(l1, l2 *ListNode) *ListNode {
	dummy := &ListNode{}
	cur := dummy

	for l1 != nil && l2 != nil {
		if l1.Val < l2.Val {
			cur.Next = l1
			l1 = l1.Next
		} else {
			cur.Next = l2
			l2 = l2.Next
		}
		cur = cur.Next
	}

	if l1 != nil {
		cur.Next = l1
	}
	if l2 != nil {
		cur.Next = l2
	}

	return dummy.Next
}
  • 时间复杂度:O(n log n),其中 n 是链表的长度。
  • 空间复杂度:O(1),我们只使用了常数级别的额外空间。

➡️ 点击查看 Java 题解

1
write your code here

相似题目

image-20250507185635425

本文作者:
本文链接: https://hgnulb.github.io/blog/2025/56342791
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!