题解 | #牛群的合并# java
牛群的合并
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
// 特殊情况处理
if (lists == null || lists.length == 0) {
return null;
}
PriorityQueue<ListNode> minHeap = new PriorityQueue<>((a, b) -> a.val - b.val);
// 将所有链表的头节点加入最小堆
for (ListNode node : lists) {
if (node != null) {
minHeap.offer(node);
}
}
ListNode dummy = new ListNode(0);
ListNode curr = dummy;
// 不断从最小堆中取出当前最小的节点,将其接到结果链表中,并将下一个节点加入最小堆
while (!minHeap.isEmpty()) {
ListNode node = minHeap.poll();
curr.next = node;
curr = curr.next;
if (node.next != null) {
minHeap.offer(node.next);
}
}
return dummy.next;
}
}
首先,创建一个最小堆(PriorityQueue),指定比较器为根据节点值的升序排列。
然后,遍历输入的链表数组,将每个链表的头节点加入最小堆。注意,在添加之前需要判断节点是否为空。
创建一个虚拟头节点 dummy 和一个指针 curr,用于构建合并后的结果链表。开始循环,不断从最小堆中取出当前最小的节点,将其接到结果链表的尾部,并将 curr 指向新加入的节点。同时,如果当前节点还有下一个节点,将其加入最小堆。
返回 dummy.next,即合并后的链表头节点。
该题考察的知识点是合并 k 个有序链表。
解题思路是使用最小堆(PriorityQueue)来实现合并。首先将所有链表的头节点加入最小堆中,然后从最小堆中取出当前最小的节点,将其接到结果链表中,并将下一个节点加入最小堆。重复这个过程直到最小堆为空。