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重拳出击)

算法leetcode|23. 合并K个升序链表(rust重拳出击)

LeetCode 23 合并K个升序链表

LeetCode 23 合并K个升序链表

Python描述 LeetCode 23. 合并K个升序链表