【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/
- HDUOJ-----A == B ?
- 用Oracle的眼光来学习MySQL 5.7的sys(上)(r11笔记第24天)
- Golang下通过syscall调用win32的api
- NYOJ----蛇形填数
- Golang语言 syscall 例子
- 用Oracle的眼光来学习MySQL 5.7的sys(下)(r11笔记第25天)
- HDUOJ-----Climbing Worm
- 闪回原理测试(二)(r11笔记第23天)
- SQL复习之为数据库用户赋予权限
- linux下syscall函数,SYS_gettid,SYS_tgkill
- 数据库收缩数据文件的尝试(三)(r11笔记第22天)
- 再议-Golang语言MessageBox用法实例
- linux下通过go语言获得系统进程cpu使用情况的方法
- Golang语言版ssh口令破解工具 --必须亲自敲代码,否则看了白看
- 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 数组属性和方法
- 体验spring-boot-devtools热部署,流畅且不失强大,Jrebel呢?
- 贷款诈骗 x 摸版0day + 实战预警脚本
- 你不知道的 Linux 使用技巧
- 一文详解 Websocket 的前世今生
- 实例 | 教你用Python写一个电信客户流失预测模型
- OpenCV快速傅里叶变换(FFT)用于图像和视频流的模糊检测
- 看了这个总结,其实 Matplotlib 可视化,也没那么难!
- 使用OpenCV进行模糊检测(拉普拉斯算子)
- 利用opencv对图像进行长曝光
- 总说手机没有“好壁纸”,Python一次性抓取500张“美女”图片,够不够用!
- KEDA发布2.0(Beta)|来一个伸缩测试
- pandas入门:Series、DataFrame、Index基本操作都有了!
- 这几个用 Pyecharts 做出来的交互图表,领导说叼爆了!
- 手把手教你用 Python 搞定网页爬虫!
- 为并发而生的 ConcurrentHashMap,基于 Java8 分析