题解 | #牛群的合并#
牛群的合并
https://www.nowcoder.com/practice/d0cb24e1494e4f45a4b7d1a17db0daef
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param lists ListNode类一维数组
* @return ListNode类
*/
public ListNode mergeKLists (ListNode[] lists) {
// write code here
// 创建结果链表的虚拟头节点
ListNode dummy = new ListNode(0);
ListNode cur = dummy; // 当前节点
// 创建最小堆,用于维护所有牛群的头节点
PriorityQueue<ListNode> minHeap = new PriorityQueue<>((a, b) -> a.val - b.val);
// 将所有牛群的头节点加入最小堆
for (ListNode groupHead : lists) {
if (groupHead != null) {
minHeap.offer(groupHead);
}
}
// 逐步从最小堆中取出最小头节点,合并到结果链表中
while (!minHeap.isEmpty()) {
ListNode minNode = minHeap.poll(); // 取出最小头节点
cur.next = minNode; // 将节点加入结果链表
cur = cur.next; // 移动指针
// 将取出节点的下一个节点加入最小堆
if (minNode.next != null) {
minHeap.offer(minNode.next);
}
}
return dummy.next; // 返回结果链表的头节点
}
}
题目考察的知识点:
合并有序链表。
解题方法分析:
- 创建一个新的链表作为结果链表,初始化为一个空节点。
- 使用一个优先队列(最小堆)来维护所有牛群的当前头节点,以便按照升序合并。
- 遍历所有牛群,将每个牛群的头节点加入到优先队列中。
- 从优先队列中取出最小的头节点,将其加入到结果链表中,并将该头节点的下一个节点(如果存在)加入到优先队列中。
- 重复步骤 4,直到优先队列为空。
- 返回结果链表的头节点的下一个节点,即为合并后的大牛群。
