LeetCode23. 合并 K 个升序链表(2024秋季每日一题 36)

news/2024/10/22 10:37:15/

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

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

示例 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:

输入:lists = []
输出:[]

示例 3:

输入:lists = [[]]
输出:[]

提示:

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


解法一:
暴力扫描

  • 每次都扫描每个链表头部
  • 找到最小的节点,加入到新链表
  • 重复上述过程,直到所有节点都已加入新链表

时间复杂度: O ( K N ) O(KN) O(KN)
空间复杂度: O ( 1 ) O(1) O(1)

/*** 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:ListNode* mergeKLists(vector<ListNode*>& lists) {ListNode* h = nullptr, * cur = nullptr;int n = lists.size();while(true){int head = -1;for(int i = 0; i < n; i++){if(lists[i] != nullptr){if(head == -1) head = i;else if(lists[head] -> val > lists[i] -> val){head = i;}}}if(head == -1) break;if(h == nullptr){h = lists[head];cur = h;}else{cur -> next = lists[head];cur = cur -> next;}lists[head] = lists[head] -> next;}return h;}
};

解法二:优先队列优化

时间复杂度: O ( N l o g ( K ) ) O(Nlog(K)) O(Nlog(K))
空间复杂度: O ( K ) O(K) O(K)

/*** 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:ListNode* mergeKLists(vector<ListNode*>& lists) {ListNode* h = nullptr, * cur = nullptr;priority_queue<pair<int, ListNode*>, vector<pair<int, ListNode*>>, greater<pair<int, ListNode*>>> q;for(auto p: lists){if(p != nullptr)q.push({p->val, p});}while(!q.empty()){auto t = q.top();q.pop();if(h == nullptr){h = t.second;cur = h;}else{cur -> next = t.second;cur = cur -> next;}ListNode* ne = t.second -> next;if(ne != nullptr) q.push({ne -> val, ne});}return h;}
};

http://www.ppmy.cn/news/1538386.html

相关文章

GS-LRM: Large Reconstruction Modelfor 3D Gaussian Splatting 论文解读

目录 一、概述 二、相关工作 1、多视图的三维重建 2、前馈重建 三、LRM 1、编码器 2、解码器 3、NeRF渲染 四、GS-LRM 1、输入处理 2、Transformer 3、损失函数 五、实验 六、局限 一、概述 该论文提出了一种利用稀疏输入图像高效预测3D高斯原语的方法&#xff…

Qt C++设计模式->中介者模式

中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式&#xff0c;定义了一个对象用于封装一系列对象之间的交互。中介者使得对象之间不再需要显式地相互引用&#xff0c;减少了对象之间的依赖关系&#xff0c;从而使系统更加松散耦合&#xff0c;并且可以…

前端框架对比与选择:详尽分析

1. 引言 随着互联网技术的飞速发展,前端开发技术也得到了迅猛提升。无论是大型企业还是中小型开发团队,使用前端框架来简化开发过程、提升开发效率已成为一种普遍现象。如今,市场上有众多的前端框架可供选择,如React、Vue.js、Angular等,如何在这些框架中进行选择成为了开…

牛客编程初学者入门训练——BC8 牛牛的字符菱形

BC8 牛牛的字符菱形 描述&#xff1a; 牛牛尝试用键盘读入一个字符&#xff0c;然后在屏幕上显示一个用这个字符填充的对角线长5个字符&#xff0c;倾斜放置的菱形。 输入描述&#xff1a; 输入一个char类型字符 输出描述&#xff1a; 输出一个用这个字符填充的对角线长5…

【ShuQiHere】 K-means 聚类算法详解:公式、代码与实战

&#x1f9e0; 【ShuQiHere】 &#x1f393; 目录 &#x1f4dc; K-means 简介K-means 工作原理理论基础 3.1 目标函数3.2 距离度量 K-means 算法步骤 4.1 具体代码实现 K-means 的优缺点如何选择正确的 K 值K-means 的改进与变体案例分析&#xff1a;如何使用 K-means 聚类&…

HTML,JavaScript,PHP,CSS,XML,SQL的区别和联习

HTML超文本标记语言——HyperText Markup Language&#xff09;是构成 Web 世界的一砖一瓦。它定义了网页内容的含义和结构。除 HTML 以外的其他技术则通常用来描述一个网页的表现与展示效果&#xff08;如 CSS&#xff09;&#xff0c;或功能与行为&#xff08;如 JavaScript&…

SpringBoot 集成GPT实战,超简单详细

Spring AI 介绍 在当前的AI应用开发中&#xff0c;像OpenAI这样的GPT服务提供商主要通过HTTP接口提供服务&#xff0c;这导致大部分Java开发者缺乏一种标准化的方式来接入这些强大的语言模型。Spring AI Alibaba应运而生&#xff0c;它作为Spring团队提供的一个解决方案&…

【WebGIS】Cesium:Viewer 初始化、地图加载与基础交互

Cesium 是一个功能强大、基于 WebGL 的开源三维地球引擎&#xff0c;它允许用户在浏览器中渲染高性能的三维地图和地球。本文将带领新手入门 Cesium&#xff0c;学习如何初始化 Cesium Viewer&#xff0c;加载地图和地形&#xff0c;了解地球的基础交互操作&#xff0c;并掌握如…