[Leetcode] Merge k sorted lists 合并k个已排序的链表
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
思路:这题最容易想到的是,(假设有k个链表)链表1、2合并,然后其结果12和3合并,以此类推,最后是123--k-1和k合并。至于两链表合并的过程见merge two sorted lists的分析。复杂度的分析见JustDoIT的博客。算法复杂度:假设每个链表的平均长度是n,则1、2合并,遍历2n个节点;12结果和3合并,遍历3n个节点;....123...k-1的结果和k合并,遍历kn个节点,总共遍历n(2+3+4+....k)=n*(k^2+k-2)/2,因此时间复杂度是O(n*(k^2+k-2)/2)=O(nk^2)。 其次,可以想到用分治的思想,两两合并直至最后。
针对方法一,
class Solution {
public:
//用向量存储链表
ListNode *mergeKLists(vector<ListNode *> &lists)
{
if(lists.size()==) return NULL;
ListNode *res=lists[]; //取出第一个链表
for(int i=;i<lists.size();i++) //反复调用
res=mergeTwoList(res,lists[i]);
return res;
}
//归并排序
ListNode *mergeTwoList(ListNode *head1,ListNode *head2)
{
ListNode node(); //创建头结点的前置结点
ListNode *res=&node;
while(head1&&head2)
{
if(head1->val<=head2->val)
{
res->next=head1;
head1=head1->next;
}
else
{
res->next=head2;
head2=head2->next;
}
res=res->next;
}
if(head1)
res->next=head1;
else if(head2)
res->next=head2;
return node.next;
}
};
针对方法二:比较难想的是,两两合并时,链表的选取。
/**
* 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)
{
int len=lists.size();
if(len==)
return NULL; while(len>)
{
int k=(len+)>>; for(int i=;i<len/;++i)
{
lists[i]=mergeTwoLists(lists[i],lists[i+k]);
}
len=k;
}
return lists[];
} ListNode *mergeTwoLists(ListNode *head1,ListNode *head2)
{
ListNode *nList=new ListNode(-);
nList->next=head1;
ListNode *pre=nList; while(head1&&head2)
{
if(head1->val >head2->val)
{
pre->next=head2;
head2=head2->next;
}
else
{
pre->next=head1;
head1=head1->next;
}
pre=pre->next;
} if(head1)
{
pre->next=head1;
}
else
pre->next=head2; return nList->next;
}
};
还有一种方法是最小堆的方法,维护一个大小为k的最小堆,初始化堆中的元素为每个链表的表头,它们会自动排好序,然后取出其中的最小元素介入新的链表中,然后,将最小元素的后继压入堆中,下次再从堆中选取最小的元素。元素加入堆中的复杂度为O(longk),总共有kn个元素加入堆中,因此,复杂度也和算法2一样是O(nklogk)。具体代码如下:
class Solution
{
private:
struct cmp
{
bool operator()(const ListNode *a,const ListNode *b)
{
return a->val >b->val;
}
}
public:
//用向量存储链表
ListNode *mergeKLists(vector<ListNode *> &lists)
{
int n=lists.size();
if (n==) return NULL; ListNode node();
ListNode *res=&node; priority_queue<ListNode*,vector<ListNode*>,cmp> que; for(int i=;i<n;i++)
{
if(lists[i])
que.push(list[i]);
} while(! que.empty())
{
ListNode *p=que.top();
que.pop();
res->next=p;
res=p; if(p->next)
que.push(p->next);
} return node.next;
}
}
此篇中,有很多分析过程都是来自JustDoIT和Grandyang的博客。
[Leetcode] Merge k sorted lists 合并k个已排序的链表的更多相关文章
- [LeetCode] Merge k Sorted Lists 合并k个有序链表
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 合并K个升序链表
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:合并,链表,单链表,题解,leetcode, 力扣,Py ...
- Leetcode23--->Merge K sorted Lists(合并k个排序的单链表)
题目: 合并k个排序将k个已排序的链表合并为一个排好序的链表,并分析其时间复杂度 . 解题思路: 类似于归并排序的思想,lists中存放的是多个单链表,将lists的头和尾两个链表合并,放在头,头向后 ...
- 【LeetCode每天一题】 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合并K个排序链表
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...
- 023 Merge k Sorted Lists 合并K个有序链表
合并K个有序链表,并且作为一个有序链表的形式返回.分析并描述它的复杂度. 详见:https://leetcode.com/problems/merge-k-sorted-lists/descripti ...
- [Leetcode] Merge two sorted lists 合并两已排序的链表
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...
- [LeetCode] 21. Merge Two Sorted Lists 合并有序链表
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...
随机推荐
- hash和history的区别
vue-router 中hash模式和history模式. 在vue的路由配置中有mode选项,最直观的区别就是在url中hash 带了一个很丑的 # ,而history是没有#的.vue默认使用ha ...
- QQ群认证 人数再度扩容 权限随之升级
群排名,得资源得天;之于排名,群容量有杠杆意义. 而今,流量分散,打法完全无法集中,全平台战略,越发凸显.QQ群,已是必争之地. 去年,Q群霸屏春天,一切那么顺其自然;而今,除了拼资源,还是拼资源.除 ...
- keil5 mdk调用外部编辑器notepad++、sublime3、VSCode总结
1.打开keil主界面,点击菜单栏Tools菜单,选择如下图所示的选项. 2.点击如下图所示的菜单上红笔标注的地方,给这个工具命名,如notepad++.sublime3.vscode等,如下图, 并 ...
- 文件 I/O字符流
import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOExceptio ...
- 编译net core时nuget里全部报错,\obj\project.assets.json找不到
除了Nuget管理设置允许下载缺少的程序包 如果你自己设置的程序包源里有一个源访问不到,则可能出现下面错误,导致所有nuget无法还原. 而且在VS2017里不会出现这个 SDK,特别是你网上下载的其 ...
- Autofac小例子
AutoFac是.net平台下的IOC容器产品.今天学习一下它的使用方法. 1.最简单的使用. public interface ITestDao { string SayHello(); } pub ...
- 虚拟现实-VR-UE4-构建光照显示光照构建失败,Swarm启动失败
闲的无聊折腾,发现想构建光照的时候,总是显示失败 如下图 百度许久,有大神指出是我在编译源码的的时候没有将其中的某个模块编译进去,只需要重新编译摸个模块就好 在UE4 的sln文件下,会看到一个Unr ...
- Page Object 设计模式介绍
Page Object 是 Selenium 自动化测试项目开发实践的最佳设计模式之一,Page Object 的主要体现于对界面交互细节的封装,这样可以使测试案例更关注与业务而非界面细节,提高测试案 ...
- Django源码分析之权限系统_擒贼先擒王
乍见 Django内置的权限系统已经很完善了,加上django-guardian提供的功能,基本上能满足大部分的权限需求.暂且不说django-guardian,我们先来看下Django内置的权限系统 ...
- Truffle3.0集成NodeJS并完全跑通(附详细实例,可能的错误)
Truffle3.0集成NodeJS并完全跑通(附详细实例,可能的错误) Truffle3.0集成NodeJS并完全跑通(附详细实例,可能的错误) 升级到Truffle3.0 如果之前安装的是Truf ...