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

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

目录

题目:

示例:

分析:

代码:


题目:

【力扣每日一题】2023.8.12 合并K个升序链表,力扣每日一题,leetcode,链表,算法,c++,数据结构

示例:

【力扣每日一题】2023.8.12 合并K个升序链表,力扣每日一题,leetcode,链表,算法,c++,数据结构

分析:

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

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

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

【力扣每日一题】2023.8.12 合并K个升序链表,力扣每日一题,leetcode,链表,算法,c++,数据结构

 emmm。。。。

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

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

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

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

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

【力扣每日一题】2023.8.12 合并K个升序链表,力扣每日一题,leetcode,链表,算法,c++,数据结构

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

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

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

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

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

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

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

不过思路提供给大家了,怎么做都可以,黑猫白猫能抓老鼠的都是好猫。文章来源地址https://www.toymoban.com/news/detail-643866.html

代码:

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;
    }
};

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

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

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

相关文章

  • 2023-07-12力扣每日一题

    链接: 2544. 交替数字和 题意: 一个数字字符串,根据符号求和,符号规律+ - + - +… 解: 简单题,遍历 实际代码: 手写: 函数!小子: 限制: 1 = n = 109

    2024年02月15日
    浏览(56)
  • 【力扣每日一题】2023.8.13 合并两个有序数组

    目录 题目: 示例: 分析: 代码: 题目给我们两个升序数组,让我们合并它们,要求合并之后仍然是升序,并且这个合并操作是在数组1原地修改的。数组1的有效数据长度为 m ,而数组1的长度为 m + n,n 是数组2的有效数据长度以及数组的长度。 比较直观容易想到的做法就是

    2024年02月12日
    浏览(41)
  • 【力扣每日一题】2023.7.30 环形链表2

    这道题属于是那种知道解法就很简单,不知道解法就很难独立想出来的那种,我们只需要稍微记住这类题的固定解法就可以。 所以接下来我先说解法,再解释为什么解法可以解出来。 那么我们都知道使用快慢指针可以找出一个链表是否有环(不知道的去看看我昨天的每日一

    2024年02月14日
    浏览(35)
  • (链表) 剑指 Offer 25. 合并两个排序的链表 ——【Leetcode每日一题】

    难度:简单 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 示例1: 输入:1-2-4, 1-3-4 输出:1-1-2-3-4-4 限制 : 0 = 链表长度 = 1000 注意:本题与 21. 合并两个有序链表 相同 💡思路: 法一:递归 将该问题可以分解成子链表,只比较当前 l1 链

    2024年02月15日
    浏览(46)
  • 2023-08-27 LeetCode每日一题(合并区间)

    点击跳转到题目位置 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 示例 2: 提示: 1 = intervals.length = 10 4 intervals[i].length == 2 0 = s

    2024年02月10日
    浏览(48)
  • 2023-08-13 LeetCode每日一题(合并两个有序数组)

    点击跳转到题目位置 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 **注意:**最终,合并后数组不应由函数返回,而是存储在数组 num

    2024年02月13日
    浏览(60)
  • 2023-07-29 LeetCode每日一题(环形链表)

    点击跳转到题目位置 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:p

    2024年02月15日
    浏览(42)
  • 2023-07-31 LeetCode每日一题(重排链表)

    点击跳转到题目位置 给定一个单链表 L 的头节点 head ,单链表 L 表示为: 请将其重新排列后变为: 不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例 1: 示例 2: 提示: 链表的长度范围为 [1, 5 * 10 4 ] 1 = node.val = 1000 (1) 使用 分治 的思路来解决问题。

    2024年02月14日
    浏览(47)
  • LeetCode每日一题:56. 合并区间(2023.8.27 C++)

    目录 56. 合并区间 题目描述: 实现代码与解析: 排序 + 贪心 原理思路:         以数组  intervals  表示若干个区间的集合,其中单个区间为  intervals[i] = [starti, endi]  。请你合并所有重叠的区间,并返回  一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间  。

    2024年02月11日
    浏览(42)
  • 2023-07-30 LeetCode每日一题(环形链表 II)

    点击跳转到题目位置 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链

    2024年02月15日
    浏览(60)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包