【LeetCode 算法】Merge k Sorted Lists 合并 K 个升序链表

这篇具有很好参考价值的文章主要介绍了【LeetCode 算法】Merge k Sorted Lists 合并 K 个升序链表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Merge k Sorted Lists 合并 K 个升序链表

问题描述:

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

k = = l i s t s . l e n g t h 0 < = k < = 1 0 4 0 < = l i s t s [ i ] . l e n g t h < = 500 − 1 0 4 < = l i s t s [ i ] [ j ] < = 1 0 4 l i s t s [ i ] 按升序排列 l i s t s [ i ] . l e n g t h 的总和不超过 1 0 4 k == lists.length\\ 0 <= k <= 10^4\\ 0 <= lists[i].length <= 500\\ -10^4 <= lists[i][j] <= 10^4\\ lists[i] 按 升序 排列\\ lists[i].length 的总和不超过 10^4 k==lists.length0<=k<=1040<=lists[i].length<=500104<=lists[i][j]<=104lists[i]按升序排列lists[i].length的总和不超过104

分析

要求非常简单,就是把多个有序链表合并成为一个有序链表。

这里有k个链表,以之前的经验,可以相邻的2个合并,假设链表的平均长度都是L,那么按照这个方式处理,需要合并k-1次,第一次的平均时间复杂度为 O ( 2 L ) O(2L) O(2L),第二次的时间复杂度为 O ( 3 L ) O(3L) O(3L),所以第k-1次的时间复杂度就是 O ( ( k − 1 ) L ) O((k-1)L) O((k1)L).
所以在这个思路下的时间复杂度就是 O ( ( k 2 ) N ) O((k^2)N) O((k2)N),但是好处是空间是 O ( 1 ) O(1) O(1).

思路没有大问题,但是数据规模大的情况下,这个时间复杂度并不友好。

为什么这个思路下的时间复杂度会达到K^2,你细品

既然每个链表都是有序的,那么可以从k个节点中找到最小的加入最终结果的尾部。
如果是朴素的找法,从k个节点找最小的,单次耗时 O ( k ) , O(k), O(k),一共有kL个节点,时间复杂度也是 O ( ( K 2 ) N ) O((K^2)N) O((K2)N)

如果利用有序的特殊条件,可以找到对数时间复杂度的方法,比如分治归并,或者是小顶堆
在不同的角度上降低了时间复杂度。

  • 分治归并与原本的归并比较起来,它只需要合并 l o g K logK logK次。
  • 小顶堆的思路,则是可以在 l o g K logK logK的时间复杂度下,找到最小的节点。

目前没有比这2个思路更快的,时间复杂度都是 O ( N K l o g K ) , O(NKlogK), O(NKlogK),但是空间复杂度一个是 O ( l o g K ) O(logK) O(logK),一个是 O ( K ) O(K) O(K).

代码

Heap

public ListNode mergeKLists(ListNode[] lists) {
        PriorityQueue<ListNode> pq = new PriorityQueue<ListNode>((a,b)->{return a.val-b.val;});
        ListNode h = new ListNode(0);
        for(ListNode no: lists){
            if(no==null) continue;
            pq.offer(no);
        }
        ListNode p = h;
        while(!pq.isEmpty()){
            ListNode cur = pq.poll();
            ListNode nx = cur.next;
            
            p.next = cur;
            p = cur;

            if(nx!=null) pq.offer(nx); 
        }
        return h.next;
    }

时间复杂度 O ( N K l o g K ) O(NKlogK) O(NKlogK)

空间复杂度 O ( K ) O(K) O(K)

Tag

Heap

Merge Sort文章来源地址https://www.toymoban.com/news/detail-643864.html

到了这里,关于【LeetCode 算法】Merge k Sorted Lists 合并 K 个升序链表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2023-08-12 LeetCode每日一题(合并 K 个升序链表)

    点击跳转到题目位置 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 示例 1: 示例 2: 示例 3:

    2024年02月13日
    浏览(39)
  • LeetCode //88. Merge Sorted Array

    You are given two integer arrays nums1 and nums2 , sorted in non-decreasing order, and two integers m and n , representing the number of elements in nums1 and nums2 respectively. Merge nums1 and nums2 into a single array sorted in non-decreasing order. The final sorted array should not be returned by the function, but instead be stored inside the array nums1

    2024年02月12日
    浏览(45)
  • 合并 K 个升序链表[困难]

    给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。 示例 1: 输入: lists = [[1,4,5],[1,3,4],[2,6]] 输出: [1,1,2,3,4,4,5,6] 解释:链表数组如下: [ 1-4-5, 1-3-4, 2-6 ] 将它们合并到一个有序链表中得到 1-1-2-3-4-4-5-6 示例 2: 输入

    2024年02月02日
    浏览(36)
  • 合并 k 个升序的链表

    C++——优先级队列(priority_queue)_c++priority_queue__好好学习的博客-CSDN博客 那么这道题就可以用小顶堆 分治的思想,归并排序的思想

    2024年02月10日
    浏览(47)
  • 合并两个有序链表,将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

    题记: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入 :l1 = [1,2,4], l2 = [1,3,4] 输出 :[1,1,2,3,4,4] 示例 2: 输入 :l1 = [], l2 = [] 输出 :[] 示例 3: 输入 :l1 = [], l2 = [0] 输出 :[0] 提示: 两个链表的节点数

    2024年02月07日
    浏览(62)
  • 23. 合并 K 个升序链表(递归分治)

    这是我的第一个自己ak的分治题目!!!好耶!!(骄傲脸 思路参考:148. 排序链表(归并排序)

    2024年01月16日
    浏览(31)
  • 面试热题(合并K个升序链表)

    给定一个链表数组,每个链表都已经按升序排列。 请将所有链表合并到一个升序链表中,返回合并后的链表。        这道题看似困难题,其实还是比较容易好想的,我们可以维护一个优先最小队列,然后声明一个虚拟头结点,每次出一个最小的节点挂载在已经挂载节点的后

    2024年02月12日
    浏览(31)
  • 【力扣每日一题】2023.8.12 合并K个升序链表

    目录 题目: 示例: 分析: 代码: 题目给我们一个链表数组,数组里的链表都是升序的,让我们合并这些链表,要求合并之后还是升序的。 最简单最直观的做法就是遍历整个数组,把每个链表的节点都取出来塞到一个容器里,然后对容器进行升序排序,接着按顺序重新串连

    2024年02月13日
    浏览(40)
  • Leetcode算法递归类—合并两个有序链表

    目录 21. 合并两个有序链表 题解: 代码: 将两个升序链表合并为一个新的  升序  链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。  示例 1: 示例 2: 示例 3: 提示: 两个链表的节点数目范围是  [0, 50] -100 = Node.val = 100 l1  和  l2  均按  非递减顺序  

    2024年02月13日
    浏览(38)
  • 数据结构之线性表的类型运用Linear Lists: 数组,栈,队列,链表

    定义 一个最简单,最基本的数据结构。一个线性表由多个相同类型的元素穿在一次,并且每一个元素都一个前驱(前一个元素)和后继(后一个元素)。 线性表的类型 常见的类型:数组、栈、队列、链表 这些不同数据结构的特性可以解决不同种类的问题 题面 题目描述 有

    2024年02月12日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包