首页 > 其他分享 >【LeetCode Hot 100】23. 合并K个升序链表

【LeetCode Hot 100】23. 合并K个升序链表

时间:2024-09-30 23:01:17浏览次数:6  
标签:node ListNode 23 合并 lists next 链表 升序

题目描述

看到这个题目会想起之前做过的合并2个升序链表。在那个题目中,由于两个链表都已经是升序的,可以将两个链表的元素进行逐个比较并添加到答案链表中。但是在本题中,每次循环都需要在k个链表的当前元素中找出最小的,而且需要在所有k个链表都遍历完之后跳出循环,所以效率比较低。

class Solution {
public:
    bool checkIsEnd(vector<ListNode*>& lists) {
        for (int i = 0; i < lists.size(); i++) {
            if (lists[i] != nullptr) return false;
        }
        return true;
    }

    ListNode* mergeKLists(vector<ListNode*>& lists) {
        if (lists.empty()) return nullptr;
        ListNode* dummy = new ListNode();
        ListNode* p = dummy;
        int k = lists.size();
        while (true) {
            if (checkIsEnd(lists)) break;
            ListNode* minNode = nullptr;
            int minNodeIdx = -1;
            for (int i = 0; i < k; i++) {
                if (lists[i] == nullptr) continue;
                if (minNode == nullptr || minNode->val > lists[i]->val) {
                    minNode = lists[i];
                    minNodeIdx = i;
                }
            }
            p->next = minNode;
            p = p->next;
            lists[minNodeIdx] = lists[minNodeIdx]->next;
        }
        return dummy->next;
    }
};

这种方法中影响时间效率的主要在于:每次循环都需要首先判断指针是否已经到达链表结尾,以及每次比较k个元素的最小值都需要遍历k个元素。这里我的一个想法是优化第一个点:使用一个bitmap存储第i个链表是否已经达到结尾,这样直接进行位运算比通过循环进行判断效率高得多,但是由于需要k位长的bit串,而题目中k的设置可以非常大,超过计算机的极限,因此这个方法不太合适。

能否使用优先队列(堆)解决k个元素的最小值的问题?可以构建一个优先队列,内部维护k个当前链表结点,每次pop出最小的结点(相当于第一种方法中将最小结点加入答案链表中),再把后面一个结点加入优先队列中(相当于第一种方法中将指针向前移动一个结点),这样循环,直到优先队列中没有剩余元素为止,说明所有k个链表中的所有元素已经比较完毕了。

class Solution {
public:
    struct Node {
        ListNode* ptr;
        bool operator<(const Node& rhs) const {
            return ptr->val > rhs.ptr->val;
        }
    };

    priority_queue<Node> q;

    ListNode* mergeKLists(vector<ListNode*>& lists) {
        for (ListNode* node : lists) {
            if (node != nullptr) {
                q.push({node});
            }
        }
        ListNode *head = new ListNode(), *tail = head;
        while (!q.empty()) {
            Node node = q.top();
            q.pop();
            tail->next = node.ptr;
            tail = tail->next;
            if (node.ptr->next) {
                q.push({node.ptr->next});
            }
        }
        return head->next;
    }
};

其实从合并2个有序链表的想法出发,可以采用类似分治、合并的方法,比如:顺序合并,用一个链表ans来维护已经合并的链表,然后循环k次,第i次合并第i个链表,最终把所有链表合并进去;分治合并,将k个链表分组配对,并将每一对中的链表进行两两合并,如此进行多轮合并直到剩下一个链表作为答案。这两种方法也是官方题解给出的前两种解法,想法是将问题归约为合并2个有序链表的方法,并直接利用。

标签:node,ListNode,23,合并,lists,next,链表,升序
From: https://www.cnblogs.com/louistang0524/p/18442537

相关文章

  • 数据结构~~链表
    目录一、链表的概念二、单链表1.单链表的结构2.单链表的接口实现 2.1、动态申请节点2.2、单链表打印 2.3、摧毁单链表 2.4、单链表尾插 2.5、单链表的头插 2.6、单链表的尾删 2.7、单链表的头删 2.8、单链表在pos位置之前插入x2.9、单链表删除pos位置的值......
  • 2023-9-30
    标签之文本标签列表标签之有序列表列表标签之无序列表......
  • Java项目:223基于Springboot + vue实现的蜗牛兼职网(含论文+答辩PPT)
    作者主页:夜未央5788 简介:Java领域优质创作者、Java项目、学习资料、技术互助文末获取源码项目介绍基于Springboot+vue实现的蜗牛兼职网本系统包含管理员、用户两个角色。管理员角色:用户管理、企业管理、兼职信息管理、职位申请管理、留言板管理、系统管理。 用......
  • The 2023 ICPC Asia Nanjing Regional Contest / The 2nd Universal Cup. Stage 11: N
    比赛链接I.Counter按时间排序即可,注意可以不清零。F.EquivalentRewriting对于每个位置,把所有有这个位置的操作编号连向这个位置最终的值,做个拓扑排序,看看字典序最大的即可。复杂度\(\Theta(n+m)\)。C.PrimitiveRoot枚举和\(m\)的公共前缀,设\(i\)位置\(m\)是\(1......
  • c#代码介绍23种设计模式_12亨元模式
    目录1、享元模式的实现精髓2、享元模式的正式定义3、亨元模式实现4、涉及的角色如下几种角色5、享元模式的优缺点6、使用场景7、实现思路在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内......
  • c#代码介绍23种设计模式_13代理模式
    目录1、代理模式的详细介绍2、代理模式定义3、代理模式实现4、代理模式所涉及的角色5、代理模式的优缺点6、实现思路在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可......
  • 2024初秋集训——提高组 #23
    C.前缀题目描述给定一个字符串\(S\),你会将这个字符串无限循环,即变成\(S+S+S+S+\dots\)。接着给定一个字符串\(T\),你要求最短的一个\(S\)的前缀使得其中存在一个子序列\(T\),若\(T_i=*\),则这一位是什么都可以。但由于\(T\)太长了,所以其中有一些字符后会有数字,表示这个......
  • PICO 2 RP2350使用官方推荐RISC-V编译器在O3优化下的coremark跑分,与Hazard3库宣传跑分
    编译环境:WSLUbuntu22.04GCC13.2.0 Hazard3存储库https://github.com/Wren6991/Hazard3/RP2350默认频率150MHz,编译内核为其RISC-V架构内核,在此频率下实测O3等级跑分453左右,O2等级跑分429左右。在测试时,当我打开第二个核心后,并且第二个核心只用来控制led灯,此时coremark跑......
  • UOS 1070/Deepin 23环境下安装Master PDF Editor 5.8.35
    在UOS1070环境下,有福昕PDF编辑器可以使用,但是升级到Deepinv23之后,福昕编辑器就无法安装了,需要换工具。比较好用的就是MasterPDFEditor,安装注册也非常简单,现在写到这里,作为记录。#目前最方便安装的是master-pdf-editor-5.9.35版本,UOS和Deepinv23都支持wgethttps://code-......
  • 信息学奥赛复赛复习07-CSP-J2020-03表达式前置知识点-结构体、链表、链式前向星
    PDF文档公众号回复关键字:2024093012020CSP-J题目1优秀的拆分[题目描述]链式前向星模板题,读入n个点,m条边,以及flag,若flag==1则图有向,否则无向。对每个点输出它的每一条边[输入格式]第一行三个数n,m,flag,题意如上所示第2~1+m行,每行三个数,x,y,z,代表从x到y有一条长为z的......