首页 > 其他分享 >23. 合并 K 个升序链表

23. 合并 K 个升序链表

时间:2024-12-18 11:26:02浏览次数:10  
标签:ListNode cur val 23 nullptr next 链表 que 升序

  1. 题目链接

  2. 解题思路:每次从全局的拿一个最小值出来,每个链表的「头」,都是最小的,所以,我们可以使用一个小根堆(优先级队列),存放每个链表当前的「头」,然后弹出一个全局最小的节点出来,然后把该节点的next放回小根堆,供之后使用。

    • 注意,压入小根堆时,要保证不为nullptr。
  3. 代码

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode() : val(0), next(nullptr) {}
     *     ListNode(int x) : val(x), next(nullptr) {}
     *     ListNode(int x, ListNode *next) : val(x), next(next) {}
     * };
     */
    class Solution {
    public:
    
        struct MyCompare{
            bool operator()(ListNode *node1, ListNode *node2) {
                return node1->val > node2->val;
            }
        };
    
        ListNode* mergeKLists(vector<ListNode*>& lists) {
            priority_queue<ListNode*, vector<ListNode*>, MyCompare> que;    // 小根堆
            for (int i = 0; i < lists.size(); ++i) {
                if (lists[i] != nullptr) {
                    que.push(lists[i]);
                }     
            }
            if (que.empty()) {
                return nullptr;
            }
            ListNode *ans = que.top();
            ListNode *cur = ans;
            que.pop();
            if (ans->next != nullptr) {
                que.push(ans->next);
            }
            while(!que.empty()) {
                cur->next = que.top();
                que.pop();
                cur = cur->next;
                if (cur->next != nullptr) {
                    que.push(cur->next);
                }
            }
            return ans;
        }
    };
    

标签:ListNode,cur,val,23,nullptr,next,链表,que,升序
From: https://www.cnblogs.com/ouyangxx/p/18614369

相关文章

  • 洛谷 B3644 【模板】拓扑排序 / 家谱树 C语言(链表队列写法)
    题目: https://www.luogu.com.cn/problem/B3644 题目描述有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。给出每个人的后代的信息。输出一个序列,使得每个人的后辈都比那个人后列出。 输入格式第1行一个整数N(1≤N≤100),表示家族的人数。接下来N行,第i行......
  • NOIP2023 游记
    写在前面意料之外的结局。已经过了一个多月了啊,本来没想写的,但不写又好像少了点什么,权当记录一下三年的OI生活吧。开始回忆。Day-?高三有推荐名额!赶紧去拉人。CCF说没交480的都不能去,寄。Day0没什么特别的,中午大巴去杭师大仓前,三年NOIP都在这里考。到的时候已......
  • C语言单向循环链表和双向循环链表
     单向循环链表#ifndef__TEST_H__#define__TEST_H__#include<stdio.h>#include<stdlib.h>typedefintdataType;typedefstructnode{ union { intlen; dataTypedata; }; structnode*next;}loopLink,*looplinkPtr;looplinkPtrcreat();intemp......
  • Crashlytics:Crashlytics自动化测试集成_2024-07-23_15-36-45.Tex
    Crashlytics:Crashlytics自动化测试集成Crashlytics自动化测试集成Crashlytics概述Crashlytics是Firebase提供的一款强大的错误报告工具,它能够帮助开发者监控和分析应用的崩溃情况,提供详细的崩溃报告,包括崩溃发生的时间、地点、设备信息、操作系统版本等,从而帮助开发者快......
  • Crashlytics在Web应用中的集成教程_2024-07-23_16-12-19.Tex
    Crashlytics在Web应用中的集成教程Crashlytics简介Crashlytics的功能与优势Crashlytics是Firebase提供的一项服务,专门用于监控和分析应用程序的崩溃情况。它能够自动收集、整理并报告应用在运行过程中遇到的错误和异常,帮助开发者快速定位问题,提高应用的稳定性和用户体验......
  • Memory Leak Detector:C++内存泄漏常见原因分析_2024-07-23_09-29-09.Tex
    MemoryLeakDetector:C++内存泄漏常见原因分析C++内存管理基础动态内存分配与释放在C++中,动态内存管理是通过new和delete操作符来实现的。new操作符用于在运行时分配内存,而delete操作符用于释放之前分配的内存。理解动态内存分配与释放的机制对于避免内存泄漏至关重要。......
  • 【数据】链表
    Python链表详解(csdn.net)【链表与数组】数组:数据支持动态进行扩容,向数组内添加数据时内存已满,则python会开辟更大的内存空间,然后将现有元素复制到新的内存块中,然后添加新元素。  扩容操作通常涉及内存分配和元素复制,这可能会导致性能下降,特别是在频繁进行插入和删除操作的......
  • 复杂链表的复制 剑指offer
    题目描述        请实现函数ComplexListNode*Clone(ComplexListNode*pHead),复制一个复杂链表。在复杂链表中,每个节点除了有一个m_pNext指针指向下一个节点,还有一个m_pSibling指针指向链表中的任意节点或者nullptr。        节点的C++定义如下: 代......
  • 二叉搜索树与双向链表 剑指offer
    题目描述        输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。比如,输入下图中左边的二叉搜索树,则输出转换之后的排序双向链表。        树节点的定义如下: 题目分析      ......
  • 238. 除自身以外数组的乘积
    除自身以外数组的乘积给你一个整数数组nums,返回数组answer,其中answer[i]等于nums中除nums[i]之外其余各元素的乘积。题目数据保证数组nums之中任意元素的全部前缀元素和后缀的乘积都在32位整数范围内。请不要使用除法,且在O(n)时间复杂度内完成此题。示例1......