刷题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. = ...
随机推荐
- 1 Oracle概述&与MySQL的差别&SQL语句分类复习
一. 知识点目录 Oracle的概念和安装 基本查询 条件查询 Oracle中的函数 多表查询 子查询 表空间的状态 用户 视图 索引 序列 同义词 PLSQL编程 游标 存储过程 存储函数 触发器 ...
- 吴裕雄--天生自然PYTHON爬虫:爬虫攻防战
我们在开发者模式下不仅可以找到URL.Form Data,还可以在Request headers 中构造浏览器的请求头,封装自己.服务器识别浏览器访问的方法就是判断keywor是否为Request h ...
- python爬虫入门之快递查询
现在快递遍布生活的角角落落,一个快递其实是信息的集合体,里面包含大量的物流信息,那能不能自己实现一个快递查询的小功能?答案是能的!现在也有别人整理好的快递查询api,比如说快递100,可以通过它提供的 ...
- Android中ListView结合CheckBox判断选中项
本文主要实现在自定义的ListView布局中加入CheckBox控件,通过判断用户是否选中CheckBox来对ListView的选中项进行相应的操作.通过一个Demo来展示该功能,选中ListView ...
- luogu P4129 [SHOI2006]仙人掌
题目描述 仙人掌图(cactus)是一种无向连通图,它的每条边最多只能出现在一个简单回路(simple cycle)里面.从直观上说,可以把仙人掌图理解为允许存在回路的树.但是仙人掌图和树之间有个本质 ...
- 安装lnmp1.5到最后出现Error: MySQL install failed的解决方法
解决方法: mv /usr/bin/cmake /usr/bin/cmake.backup wget http://www.cmake.org/files/v3.0/cmake-3.0.2.tar.g ...
- Vue.js面试题
一.什么是MVVM? MVVM是Model-View-ViewModel的缩写.MVVM是一种设计思想.Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑:View 代表UI ...
- CPU、内存、硬盘之间的关系
要完完全全地讲清楚cpu.内存.硬盘之间的关系,博客的篇幅是不够的.这里简单的介绍以下它们之间的关系,抛砖引玉. 1.CPU即中央处理器,是英语“Central Processing Unit”的缩写 ...
- 白手起家Django项目发布中篇_Centos下Python2和3并存环境部署
python环境部署 我们今天学习的内容是如何将Django项目部署到linux服务器上,我们部署的linux系统是centos7首先,我们先在linux上搭建我们的Python3环境: 在这里首先强 ...
- WINccflexiable2008 的水箱控制上位机HMI仿真
步骤1 将PLC程序编写完成,CPU为314-2DP 符号表中的符号可以被所有逻辑块调用 步骤2 组态PLC300与西门子触摸屏170系列 TP177B CLOLOR PN/DP的MPI通信. 步骤3 ...