13_k路合归并(K-way merge)
简单描述
K路归并能帮咱们解决那些涉及到多组排好序的数组的问题。 每当你的输入是K个排好序的数组,你就可以用堆来高效顺序遍历其中所有数组的所有元素。你可以将每个数组中最小的一个元素加入到最小堆中,从而得到全局最小值。当我们拿到这个全局最小值之后,再从该元素所在的数组里取出其后面紧挨着的元素,加入堆。如此往复直到处理完所有的元素。
优势
- 处理多个排好序的数集很方便
使用场景
- 该问题的输入是排好序的数组,链表或是矩阵
- 如果问题让咱们合并多个排好序的集合,或是需要找这些集合中最小的元素
例子
/**
* leetcoce_23_合并k个排序链表 k路合并法
* <p>
* 思路:遍历链表,加入到优先队列。再从优先队列拿出即可(利用优先队列的 有序性)
* <p>
* 做法:1、创建优先队列
* 2、遍历插入优先队列(最大堆或者最小堆)
* 3、从堆中拿出,此时输出是 有序的
*
* @param lists
* @return
*/
public static ListNode mergeKLists(ListNode[] lists) {
Queue<Integer> queue = new PriorityQueue<>((i1, i2) -> Integer.compare(i2, i1));
// 合并链表元素到队列
for (ListNode node : lists) {
while (node != null) {
queue.offer(node.val);
node = node.next;
}
}
// 把队列中元素添加到了新的链表
ListNode ans = null;
while (!queue.isEmpty()) {
ListNode curr = new ListNode(queue.poll()); // 每次拿出最大元素,并删除
curr.next = ans;
ans = curr;
}
return ans;
}