✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: Java华为OD机试真题(2022&2023)
文章目录
- 1. 题目描述
- 2. 输入描述
- 3. 输出描述
- 4. Java算法源码
- 5. 测试
- 6.解题思路
1. 题目描述
给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。
2. 输入描述
lists = [[1,4,5],[1,3,4],[2,6]]
3. 输出描述
[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
1->4->5,
1->3->4,
2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6
4. Java算法源码
public ListNode mergeKLists(ListNode[] lists) {
// 创建一个优先队列,按照节点的值进行升序排序
PriorityQueue<ListNode> pq = new PriorityQueue<>((a, b) -> a.val - b.val);
// 将链表的头节点加入优先队列
for (ListNode node : lists) {
if (node != null) {
pq.offer(node);
}
}
// 创建一个哑节点作为结果链表的头节点
ListNode dummy = new ListNode(0);
ListNode curr = dummy;
// 不断从优先队列中取出最小节点,将其加入结果链表
while (!pq.isEmpty()) {
ListNode minNode = pq.poll();
curr.next = minNode;
curr = curr.next;
if (minNode.next != null) {
pq.offer(minNode.next);
}
}
return dummy.next;
}
5. 测试
6.解题思路
整体思路如下:
- 创建一个优先队列,按照节点的值进行升序排序。
- 将链表的头节点依次加入优先队列。
- 创建一个哑节点作为结果链表的头节点。
- 不断从优先队列中取出最小节点,将其加入结果链表。
- 如果最小节点还有下一个节点,将其加入优先队列。
- 重复步骤 4 和 5,直到优先队列为空。
- 返回结果链表。
这种解法的时间复杂度为 O(NlogK),其中 N 是所有链表节点的总数,K 是链表数组的长度。