当前位置: 首页 > news >正文

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

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

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

示例 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.mrgr.cn/news/48923.html

相关文章:

  • 2.1 HTML5 - Canvas标签
  • 信号完整性分析概论
  • 【iOS】YYModel的初步学习
  • 【学术会议投稿链接】React前端框架:构建现代Web应用的强大工具
  • 【C++ 真题】B2082 数字统计
  • 特征工程在机器学习中的重要性及实践
  • 计算机挑战赛5
  • Java项目实战II基于Java+Spring Boot+MySQL的服装销售平台(源码+数据库+文档)
  • 聚类分析 | AP近邻传播聚类算法
  • 和外部机构API交互如何防止外部机构服务不可用拖垮调用服务
  • 子网掩码、网络地址、广播地址、子网划分及计算
  • c++ libtorch tensor 注意浅拷贝
  • C++入门基础知识109—【关于C++ if 语句】
  • OAuth和OpenID Connect原理及认证实现的案例
  • Spring Boot 3 文件管理:上传、下载、预览、查询与删除(全网最全面教程)
  • R语言绘制线性回归图
  • 手写mybatis之解析和使用ResultMap映射参数配置
  • 架构师之路-学渣到学霸历程-11
  • 鸿蒙跨设备协同开发02——RichEditor跨设备获取文件
  • 八大排序--08快速排序