刷题23. Merge k Sorted Lists
一、题目说明
这个题目是23. Merge k Sorted Lists,归并k个有序列表生成一个列表。难度为Hard,实际上并不难,我一次提交就对了。
二、我的解答
就是k路归并,思路很简单,实现也不难。
#include<iostream>
#include<vector>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists){
ListNode dummy(-1);
ListNode *p,*pResult,*cur;
if(lists.size()<=0) return NULL;
for(int t=0;t<lists.size();t++){
p = lists[t];
pResult = &dummy;
while(p !=NULL){
while(pResult->next!=NULL && pResult->next->val < p->val){
pResult = pResult->next;
}
cur = new ListNode(p->val);
cur->next = pResult->next;
pResult->next = cur;
p = p->next;
}
}
return dummy.next;
}
};
int main(){
Solution s;
ListNode* l1, *l2, *l3, *p;
// init l1
l1 = new ListNode(5);
p = new ListNode(4);
p->next = l1;
l1 = p;
p = new ListNode(1);
p->next = l1;
l1 = p;
// init l2
l2 = new ListNode(4);
p = new ListNode(3);
p->next = l2;
l2 = p;
p = new ListNode(1);
p->next = l2;
l2 = p;
// init l1
l3 = new ListNode(6);
p = new ListNode(2);
p->next = l3;
l3 = p;
vector<ListNode*> lists;
lists.push_back(l1);
lists.push_back(l2);
lists.push_back(l3);
ListNode* r = s.mergeKLists(lists);
while(r != NULL){
cout<<r->val<<" ";
r = r->next;
}
return 0;
}
不过,性能一般:
Runtime: 172 ms, faster than 21.46% of C++ online submissions for Merge k Sorted Lists.
Memory Usage: 12.8 MB, less than 5.95% of C++ online submissions for Merge k Sorted Lists.
三、优化措施
上面的实现,之所以性能不足,在于一次归并一个队列,用的是插入排序。其实n路归并,可以用优先级队列priority_queue一次实现的。
class Solution {
struct CompareNode {
bool operator()(ListNode* const & p1, ListNode* const & p2) {
// return "true" if "p1" is ordered before "p2", for example:
return p1->val > p2->val;
//Why not p1->val <p2->val; ??
}
};
public:
ListNode *mergeKLists(vector<ListNode *> &lists) {
ListNode dummy(0);
ListNode* tail=&dummy;
priority_queue<ListNode*,vector<ListNode*>,CompareNode> queue;
for (vector<ListNode *>::iterator it = lists.begin(); it != lists.end(); ++it){
if (*it)
queue.push(*it);
}
while (!queue.empty()){
tail->next=queue.top();
queue.pop();
tail=tail->next;
if (tail->next){
queue.push(tail->next);
}
}
return dummy.next;
}
};
刷题23. Merge k Sorted Lists的更多相关文章
- [Leetcode][Python]23: Merge k Sorted Lists
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 23: Merge k Sorted Listshttps://oj.leet ...
- 21.Merge Two Sorted Lists 、23. Merge k Sorted Lists
21.Merge Two Sorted Lists 初始化一个指针作为开头,然后返回这个指针的next class Solution { public: ListNode* mergeTwoLists ...
- 23. Merge k Sorted Lists - LeetCode
Question 23. Merge k Sorted Lists Solution 题目大意:合并链表数组(每个链表中的元素是有序的),要求合并后的链表也是有序的 思路:遍历链表数组,每次取最小节点 ...
- 蜗牛慢慢爬 LeetCode 23. Merge k Sorted Lists [Difficulty: Hard]
题目 Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity ...
- [LeetCode] 23. Merge k Sorted Lists 合并k个有序链表
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...
- leetcode 23. Merge k Sorted Lists(堆||分治法)
Merge k sorted linked lists and return it as one sorted list. 题意:把k个已经排好序的链表整合到一个链表中,并且这个链表是排了序的. 题解 ...
- 【LeetCode】23. Merge k Sorted Lists 合并K个升序链表
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:合并,链表,单链表,题解,leetcode, 力扣,Py ...
- [leetcode 23]Merge k Sorted Lists
1 题目 Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexi ...
- 23. Merge k Sorted Lists
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. = ...
随机推荐
- CentOS 下的apache服务器配置与管理
一.WEB服务器与Apache1.web服务器与网址 2.Apache的历史 3.补充http://www.netcraft.com/可以查看apache服务器的市场占有率同时必须注意的是ngnix, ...
- C语言中的变量和常量的区别和使用
变量 定义一个变量:类型 变量名=值; int a =0; // 变量,可以在赋值 常量 定义一个常量 const 常量类型 常量名称 = 值 const int LENTHER = 521 // 定 ...
- express框架开发接口部署线上环境PM2
1.PM2介绍 PM2是一个线上环境下,用于启动nodejs进程守护的工具,用来保证服务的稳定及分摊服务器进程和压力. 2.下载安装 npm install pm2 -g => pm2 --v ...
- System.Diagnostics.Conditional 的妙用 -- 把文档放在代码中
最近的工作跟 UI 打交道比较多, 各种坑. 今天从 Prefab 的序列化功能来说说 System.Diagnostics.Conditional 的妙用. 我们做 UI 面对各种按钮, 组件的获取 ...
- SCP 上传
https://www.runoob.com/linux/linux-comm-scp.html scp 当前路径(绝对路径) root@xx.xx.xx :/xx/xx/xx/
- Mini_Linux需要搭的环境
1.bash:ifconfig:command not found sudo yum install -y net-tools 2.如果Linux系统是通过复制得到 需要更改hostname vi ...
- C# Show()与ShowDialog()的区别-----转载
A.WinForm中窗体显示 显示窗体可以有以下2种方法: Form.ShowDialog方法 (窗体显示为模式窗体) Form.Show方法 (窗体显示为无模式窗体) 两者具体区别如下: 1 ...
- 高斯消元几道入门题总结POJ1222&&POJ1681&&POJ1830&&POJ2065&&POJ3185
最近在搞高斯消元,反正这些题要么是我击败了它们,要么就是这些题把我给击败了.现在高斯消元专题部分还有很多题,先把几道很简单的入门题总结一下吧. 专题:http://acm.hust.edu.cn/vj ...
- windows环境变量引发的血案
最近重装了系统,决心使用Anaconda来管理python包和虚拟环境.在完成一系列配置后,运行程序,发现老是报错 D:\Anaconda3\envs\jobnote>python E:\wor ...
- [经验] Cocos Creator使用笔记 --- 调用不同脚本下的函数
因为 JavaScript 不同于 Java, 想要调用不同文件的函数的话不能直接 ClassName object = new ClassName(); object.function(param) ...