【LeetCode每日一题】23. Merge k Sorted Lists
时间:2022-07-22
本文章向大家介绍【LeetCode每日一题】23. Merge k Sorted Lists,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目描述
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Example:
Input:
[
1->4->5,
1->3->4,
2->6
]
Output: 1->1->2->3->4->4->5->6
合并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) {
if (lists.empty()) return nullptr;
vector<int> arr;
for (ListNode* list : lists){
while (list){
arr.push_back(list->val);
list = list->next;
}
}
sort(arr.begin(), arr.end());
ListNode *first = new ListNode(-1), *node = first;
for (int val : arr){
node->next = new ListNode(val);
node = node->next;
}
return first->next;
}
};
时间复杂度:O(NlogN)。
空间复杂度:O(N).
优先队列
同时进行k个链表的合并,通过将每个链表的头结点放入优先队列中(同时完成了排序),弹出节点,将节点并入结果链表中,如果当前节点仍不为空,则将下一个节点压入优先队列中。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
auto cmp = [](ListNode* &l1, ListNode* &l2){
return l1->val > l2->val;
};
// 定义一个小顶堆
priority_queue<ListNode*, vector<ListNode*>, decltype(cmp) > q(cmp);
for (auto node: lists){
if(node) q.push(node);
}
ListNode* dummy = new ListNode(-1), *cur = dummy;
while (!q.empty()){
auto t = q.top(); q.pop();
cur->next = t;
cur = cur->next;
if (t->next) q.push(t->next);
}
return dummy->next;
}
};
时间复杂度:O(Nlogk)
空间复杂度:O(N)新链表所用空间;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) {
if (lists.empty()) return nullptr;
int size = lists.size();
while (size > 1){
int k = (size + 1)/2;
for (int i=0; i< size/2; i++)
lists[i] = merge(lists[i], lists[i+k]);
size = k;
}
return lists[0];
}
private:
ListNode* merge(ListNode *l1, ListNode *l2){
ListNode *first = new ListNode(-1);
ListNode *node = first;
while(l1 && l2){
if (l1->val < l2->val){
node->next = l1;
l1 = l1->next;
}
else{
node->next = l2;
l2 = l2->next;
}
node = node->next;
}
if (l1) node->next = l1;
if (l2) node->next = l2;
return first->next;
}
};
时间复杂度:O(Nlogk)
空间复杂度:O(1)
References
https://leetcode.com/problems/merge-k-sorted-lists/solution/
- 浅谈用Python计算文本BLEU分数
- Fourinone如何实现并行计算和数据库引擎
- 在Python中用一个长短期记忆网络来演示记忆
- CDA数据分析师学习之路第3期 | Spark RDD的转换操作举例
- 通过Temboo实现从Arduino获取雅虎天气信息
- 自动化模式中的MySQL
- 通过Pandas实现快速别致的数据分析
- R语言中的非线性分类
- 用SPSS做数据分析?先弄懂SPSS的基础知识吧
- 学习笔记CB001:NLTK库、语料库、词概率、双连词、词典
- 时序列数据库武斗大会之 OpenTSDB 篇
- 应当使用 SQLite 的五个原因
- Apache Spark作为编译器:深入介绍新的Tungsten执行引擎
- DC/OS 的安装与部署
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 浅谈数据库集群方案
- SkyWalking - 实现微服务监控告警
- Actuator + Prometheus + Grafana搭建微服务监控平台
- Python 用smtplib库发邮件报错:[WinError 10061] 由于目标计算机积极拒绝,无法连接。解决办法
- python运算符
- Windows 技术篇-禁用windows更新服务,解决windows无法关闭更新问题,解决windows自己启用更新问题。
- 搭建 SkyWalking 服务(For ElasticSearch 7)
- 基于 SkyWalking 实现服务链路追踪
- Python 技巧篇-字符串灵活处理:字符串过滤、字符串拼接,字符串切片,特殊、超长字符串的处理实例演示
- Python 技巧篇-开头注释怎么写最好,开头注释需要包含什么,开头注释的重要性
- 在CentOS8下安装Python3和ansible
- 开发一个属于自己的Spring Boot Starter
- 如何让Tomcat使用APR连接器
- VueJS中使用前端虚拟接口Mock.js
- CentOS7下源码安装MySQL 8.x