题解 | #牛群的合并#
牛群的合并
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;
// 定义一个堆(优先队列),并定义比较器规则 -> 按节点值升序 -> 小顶堆
Queue<ListNode> queue = new PriorityQueue<>((o1, o2) -> o1.val - o2.val);
// 遍历节点数组,将节点加入到优先队列中
for (ListNode node : lists) {
// !!! 注意: 这里需要判断边界值,空链表跳过
if (node != null) queue.offer(node);
}
// 定义返回结果的头节点,和一个cur: 用于将遍历过程中的各个节点串联起来
ListNode head = null, cur = null;
// 只要堆中还有元素,就一直遍历
while (!queue.isEmpty()) {
// 堆中弹出一个节点
ListNode node = queue.poll();
// 如果头节点为空,即还没设置,就设置头节点,并将cur指向头节点
if (head == null) {
// 只会第一次进来
head = node;
cur = head;
} else {
// 否则,将新弹出的节点,接到链表后面
cur.next = node;
}
// cur往后走一步
cur = node;
// 如果node还有下一个节点,就将下一个节点加入到优先队列中
if (node.next != null) queue.offer(node.next);
}
// 返回头节点
return head;
}
}
#优先队列的应用##有序链表合并#线性表基础 文章被收录于专栏
链表、递归、栈
深信服公司福利 731人发布