Skip to content

Commit 64070d9

Browse files
committed
三刷23
1 parent 8a91d09 commit 64070d9

File tree

5 files changed

+112
-9
lines changed

5 files changed

+112
-9
lines changed

docs/0023-merge-k-sorted-lists.adoc

Lines changed: 56 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,84 @@
11
[#0023-merge-k-sorted-lists]
2-
= 23. Merge k Sorted Lists
2+
= 23. 合并 K 个升序链表
33

4-
{leetcode}/problems/merge-k-sorted-lists/[LeetCode - Merge k Sorted Lists^]
4+
https://leetcode.cn/problems/merge-k-sorted-lists/[LeetCode - 23. 合并 K 个升序链表 ^]
55

6-
Merge _k_ sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
6+
给你一个链表数组,每个链表都已经按升序排列。
77

8-
*Example:*
8+
请你将所有链表合并到一个升序链表中,返回合并后的链表。
99

10-
[subs="verbatim,quotes,macros"]
11-
----
12-
*Input:*
10+
*示例 1:*
11+
12+
....
13+
输入:lists = [[1,4,5],[1,3,4],[2,6]]
14+
输出:[1,1,2,3,4,4,5,6]
15+
解释:链表数组如下:
1316
[
1417
1->4->5,
1518
1->3->4,
1619
2->6
1720
]
18-
*Output:* 1->1->2->3->4->4->5->6
19-
----
21+
将它们合并到一个有序链表中得到。
22+
1->1->2->3->4->4->5->6
23+
....
24+
25+
*示例 2:*
26+
27+
....
28+
输入:lists = []
29+
输出:[]
30+
....
31+
32+
*示例 3:*
33+
34+
....
35+
输入:lists = [[]]
36+
输出:[]
37+
....
38+
39+
*提示:*
40+
41+
* `k == lists.length`
42+
* `0 \<= k \<= 10^4^`
43+
* `+0 <= lists[i].length <= 500+`
44+
* `-10^4^ \<= lists[i][j] \<= 10^4^`
45+
* `lists[i]`*升序* 排列
46+
* `lists[i].length` 的总和不超过 `10^4^`
2047
2148
== 思路分析
2249

2350
优先队列是最优解,退而求其次,可以考虑使用分治。
2451

2552
[[src-0023]]
53+
[tabs]
54+
====
55+
一刷::
56+
+
57+
--
2658
[{java_src_attr}]
2759
----
2860
include::{sourcedir}/_0023_MergeKSortedLists.java[tag=answer]
2961
----
62+
--
3063
64+
二刷::
65+
+
66+
--
3167
[{java_src_attr}]
3268
----
3369
include::{sourcedir}/_0023_MergeKSortedLists_2.java[tag=answer]
3470
----
71+
--
72+
73+
三刷::
74+
+
75+
--
76+
[{java_src_attr}]
77+
----
78+
include::{sourcedir}/_0023_MergeKSortedLists_3.java[tag=answer]
79+
----
80+
--
81+
====
3582

3683
== 参考资料
3784

logbook/202503.adoc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,11 @@ endif::[]
8585
|{doc_base_url}/0295-find-median-from-data-stream.adoc[题解]
8686
|⭕️ 双堆,思路理解,写代码却有很多问题。
8787

88+
|{counter:codes2503}
89+
|{leetcode_base_url}/merge-k-sorted-lists/[23. Merge k Sorted Lists^]
90+
|{doc_base_url}/0023-merge-k-sorted-lists.adoc[题解]
91+
|✅ 多路归并
92+
8893
|===
8994

9095
截止目前,本轮练习一共完成 {codes2503} 道题。

src/main/java/com/diguage/algo/leetcode/_0023_MergeKSortedLists.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@
3131
public class _0023_MergeKSortedLists {
3232
// tag::answer[]
3333

34+
/**
35+
* @author D瓜哥 · https://www.diguage.com
36+
* @since 2019-10-22 12:40:12
37+
*/
3438
public ListNode mergeKLists(ListNode[] lists) {
3539
PriorityQueue<ListNode> heap = new PriorityQueue<>((l1, l2) -> l1.val - l2.val);
3640
for (ListNode l : lists) {

src/main/java/com/diguage/algo/leetcode/_0023_MergeKSortedLists_2.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@
3030
*/
3131
public class _0023_MergeKSortedLists_2 {
3232
// tag::answer[]
33+
34+
/**
35+
* @author D瓜哥 · https://www.diguage.com
36+
* @since 2024-07-02 20:13:49
37+
*/
3338
public ListNode mergeKLists(ListNode[] lists) {
3439
if (Objects.isNull(lists) || lists.length == 0) {
3540
return null;
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.diguage.algo.leetcode;
2+
3+
import com.diguage.algo.util.ListNode;
4+
5+
import java.util.Comparator;
6+
import java.util.Objects;
7+
import java.util.PriorityQueue;
8+
9+
public class _0023_MergeKSortedLists_3 {
10+
// tag::answer[]
11+
/**
12+
* @author D瓜哥 · https://www.diguage.com
13+
* @since 2025-03-30 23:20:44
14+
*/
15+
public ListNode mergeKLists(ListNode[] lists) {
16+
if (Objects.isNull(lists) || lists.length == 0) {
17+
return null;
18+
}
19+
// 注意:这里使用一个虚拟头节点,方便后续的操作
20+
ListNode dummy = new ListNode(0);
21+
// 自定义 Comparator,对堆内的 ListNode 头节点数字做排序
22+
PriorityQueue<ListNode> pq = new PriorityQueue<>(Comparator.comparingInt(a -> a.val));
23+
for (ListNode node : lists) {
24+
if (Objects.nonNull(node)) {
25+
pq.offer(node);
26+
}
27+
}
28+
ListNode current = dummy;
29+
while (!pq.isEmpty()) {
30+
ListNode node = pq.poll();
31+
current.next = node;
32+
current = node;
33+
ListNode next = node.next;
34+
node.next = null;
35+
if (Objects.nonNull(next)) {
36+
pq.offer(next);
37+
}
38+
}
39+
return dummy.next;
40+
}
41+
// end::answer[]
42+
}

0 commit comments

Comments
 (0)