[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 ...
随机推荐
- JS高级. 03 混入式继承/原型继承/经典继承、拓展内置对象、原型链、创建函数的方式、arguments、eval、静态成员、实例成员、instanceof/是否在同一个原型链
继承:当前对象没有的属性和方法,别人有,拿来给自己用,就是继承 1 混入式继承 var I={ }; var obj = { name: 'jack', age:18, sayGoodbye : fu ...
- React学习(3)——Router路由的使用和页面跳转
React-Router的中文文档可以参照如下链接: http://react-guide.github.io/react-router-cn/docs/Introduction.html 文档中介绍 ...
- web前端总结面试问题<经常遇到的手写代码>
冒泡排序 var arr = [5,8,3,6,9] for(var i=0;i<arr.length;i++){ for(var j=i+1;j<arr.length;j++){ if( ...
- redis相关目录
redis的docker化安装 redis的主从配置
- MySQL数据库查看数据表占用空间大小和记录数
MySQL数据库中每个表占用的空间.表记录的行数的话,可以打开MySQL的 information_schema 数据库.在该库中有一个 TABLES 表,这个表主要字段分别是: TABLE_SCHE ...
- eclipse 右键没有Build Path
如果Project Explorer右键没有build pathWindow ->show view 选择package explorer 参考https://blog.csdn.net/cod ...
- webug学习(1)
webug的题目,比较简单,拿来巩固一哈. 1. 一看就知道是注入漏洞了,啥也不说sqlmap直接开炮. 先-u 之后-u 网址 --current-db 获取当前网址的数据库 所以当前数据库就是 p ...
- Tensorflow之MNIST的最佳实践思路总结
Tensorflow之MNIST的最佳实践思路总结 在上两篇文章中已经总结出了深层神经网络常用方法和Tensorflow的最佳实践所需要的知识点,如果对这些基础不熟悉,可以返回去看一下.在< ...
- 生産管理(PP)
伝票系 製造指図 マスタ系 生産資源/治工具 作業区 能力 作業手順 作業バージョン 作業記録 需要予測プロファイル 計画手配 MRP レシピ その他 カスタマイズ系 BOM関連 製造指図確認 伝票系 ...
- ABAP CDS ON HANA-(12)ODATA Service
Create a CDS view and we have the view type as ‘BASIC’ view To publish this as oData, add the annota ...