Leetcode23. 合并K个升序链表(优先队列)
Posted !0 !
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode23. 合并K个升序链表(优先队列)相关的知识,希望对你有一定的参考价值。
题目链接:https://leetcode-cn.com/problems/merge-k-sorted-lists/
解题思路
当我们合并两个链表时,我们是利用的双指针,比较两个链表的最小值,加入合并之后新链表。
而这题,如果我们要合并k个链表,可以用k个指针,但是用k个指针不是很方便,所以我们想一想可以用什么方法解决可以不用k个指针,这里我们就要想之前合并两个链表为什么要用双指针,是为了找到最小的那个值,说到这里,我们就可以想到用优先队列,因为优先队列就可以使队首是最小的值,所以我们这里可以把所有链表都加入优先队列,每次弹出最小值,并且把最小值的链表节点往后移动一位(因为当前节点已经加入了排序之后的链表,要开始往后比较),并且加入优先队列继续合并。
代码
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if (lists == null || lists.length == 0) //特判
return null;
PriorityQueue<ListNode> queue = new PriorityQueue<>((o1, o2) -> o1.val - o2.val);//优先队列,按照值从小到大排序
ListNode newHead = new ListNode(-1); //排序后的链表的头节点
ListNode l1 = newHead;
for (ListNode i : lists) //将链表数组中每个链表加入队列中
if (i != null)
queue.add(i);
while (!queue.isEmpty()) {
l1.next = queue.poll(); //将链表数组中最小的值的那整个链表弹出
l1 = l1.next; //遍历下一个节点
if (l1.next != null) //如果该链表不为空
queue.add(l1.next); //将该链表下一个值加入队列
}
return newHead.next;
}
}
复杂度分析
- 时间复杂度:O(k * n * logk),k代表链表长度
- 空间复杂度:O(k)
以上是关于Leetcode23. 合并K个升序链表(优先队列)的主要内容,如果未能解决你的问题,请参考以下文章
[LeetCode]23. 合并K个排序链表(优先队列;分治待做)
算法leetcode|23. 合并K个升序链表(rust重拳出击)