【力扣每日一题】2023.8.12 合并K个升序链表

news/2024/7/7 9:30:20 标签: leetcode, 链表, 算法, c++, 数据结构

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

题目给我们一个链表数组,数组里的链表都是升序的,让我们合并这些链表,要求合并之后还是升序的。

最简单最直观的做法就是遍历整个数组,把每个链表的节点都取出来塞到一个容器里,然后对容器进行升序排序,接着按顺序重新串连成新的链表就可以。

我本以为这么做有些暴力,不太好,结果:

 emmm。。。。

也没什么不好的,最高端的食材往往只需要最简单的烹饪方式,最困难的题目往往只需要最朴素的解法。

那除了这个取出来再排序的“暴力”解法,那还有一种就是不用我们亲自去“暴力”的方法。

那就是利用小顶堆的堆顶永远是堆内的最小元素这一特性,我们把元素全部塞进小顶堆。

接着进入while循环,只要堆不为空,那我就把堆顶取出来接到新链表后。

最后一样也是可以获取到一条升序的链表

两种解法没什么本质上的区别,不同的就是第一种我们手动去排序了,第二种是人家帮我们去排序了。没啥本质上的区别,运行的结果也是一样的。

既然这种偏“暴力”的解法都还解得不错,那么用这种“暴力”解法就好了。

如果一定要利用到原本链表就升序的这个特性的话,也可以。

我们先进入while循环,循环的条件是整个原数组里的链表至少有一个不为空指针节点。

接着进入一层for循环,去寻找数组里那个链表头的值最小(不唯一),接着把它取出来放到新链表的后面,再把这个链表往后移动。

直到原数组里的链表都变成了空指针节点,那么我们就是合并完成了。

我个人觉得还不如上面的两种“暴力”解法简单。

不过思路提供给大家了,怎么做都可以,黑猫白猫能抓老鼠的都是好猫。

代码:

class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        //把节点塞到一个容器里排序后重新连接成链表
        vector<ListNode*>cache;
        for(auto list:lists){
            while(list){
                cache.push_back(list);
                list=list->next;
            }
        }
        sort(cache.begin(),cache.end(),[](auto a,auto b){return a->val<b->val;});
        ListNode* res=new ListNode(0);
        ListNode* cur=res;
        for(ListNode* node:cache){
            cur->next=node;
            cur=cur->next;
        }
        cur->next=nullptr;
        return res->next;
        
        //把节点塞到一个小顶堆里,然后生成链表
        auto cmp=[](auto a,auto b){return a->val>b->val;};
        priority_queue<ListNode*,vector<ListNode*>,decltype(cmp)>minpq;
        for(auto list:lists){
            while(list){
                minpq.push(list);
                list=list->next;
            }
        }
        ListNode* res=new ListNode(0);
        ListNode* cur=res;
        while(!minpq.empty()){
            cur->next=minpq.top();
            minpq.pop();
            cur=cur->next;
        }
        cur->next=nullptr;
        return res->next;
    }
};


http://www.niftyadmin.cn/n/4936965.html

相关文章

Leetcode-每日一题【剑指 Offer 20. 表示数值的字符串】

题目 请实现一个函数用来判断字符串是否表示数值&#xff08;包括整数和小数&#xff09;。 数值&#xff08;按顺序&#xff09;可以分成以下几个部分&#xff1a; 若干空格一个 小数 或者 整数&#xff08;可选&#xff09;一个 e 或 E &#xff0c;后面跟着一个 整数若干空…

线程间的通信(互斥)

互斥&#xff1a;解决程序中临界资源的竞争问题 函数接口说明&#xff1a; pthread_mutex_init&#xff1a;初始化互斥锁 pthread-mutex_lock&#xff1a;申请互斥锁&#xff08;加锁&#xff09; pthread_mutex_unlock&#xff1a;释放互斥锁&#xff08;解锁&#xff09;…

Nodejs 第十章(全局变量)

如何在nodejs定义全局变量呢&#xff1f; 在nodejs中使用global定义全局变量&#xff0c;定义的变量&#xff0c;可以在引入的文件中也可以访问到该变量&#xff0c;例如a.js global.xxx xxx require(xxx.js) xxx.js 也可以访问到该变量&#xff0c;在浏览器中我们定义的全局…

Vue+ElementUI实现选择指定行导出Excel

这里记录一下&#xff0c;今天写项目时 的一个需求&#xff0c;就是通过复选框选中指定行然后导出表格中选中行的Excel表格 然后这里介绍一个工具箱(模板)&#xff1a;vue-element-admin 将它拉取后&#xff0c;运行就可以看到如下界面&#xff1a; 这里面的很多功能都已经实现…

3.1 Qt样式选择器

本期内容 3.1 样式选择器 3.1.1 Universal Selector (通用选择器) 3.1.2 Type Selector (类型选择器) 3.1.3 Property Selector (属性选择器) 3.1.4 Class Selector (类选择器) 3.1.5 ID Selector (ID选择器) 3.1.6 Descendant Selector (后裔选择器) 3.1.7 Chil…

Java接口压力测试—如何应对并优化Java接口的压力测试

导言 在如今的互联网时代&#xff0c;Java接口压力测试是评估系统性能和可靠性的关键一环。一旦接口不能承受高并发量&#xff0c;用户体验将受到严重影响&#xff0c;甚至可能导致系统崩溃。因此&#xff0c;了解如何进行有效的Java接口压力测试以及如何优化接口性能至关重要…

openGauss学习笔记-38 openGauss 高级数据管理-游标

文章目录 openGauss学习笔记-38 openGauss 高级数据管理-游标38.1 语法格式38.2 参数说明38.3 示例 openGauss学习笔记-38 openGauss 高级数据管理-游标 为了处理SQL语句&#xff0c;存储过程进程分配一段内存区域来保存上下文联系。游标是指向上下文区域的句柄或指针。借助游…

【Linux系统编程】24.管道、pipe、fifo、进程间文件通信

目录 管道 实现原理 特质 局限性 读写行为 读管道 写管道 缓冲区大小 返回值 优缺点 优点 缺点 pipe 参数pipefd[2] 返回值 测试代码1 测试结果 测试代码2 测试结果 测试代码3 测试结果 fifo 创建方式 参数pathname 参数mode 返回值 测试代码4 测试…