Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

类似于归并2个链表,暴力一点的方法就是,每取出一个list就与以前的list归并返回merge后list,知道所有list merge完成。

但是可惜,这样做会TLE。贴下代码先:

 /**
* 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) {
ListNode * ret = NULL;
for(auto * it : lists){
ret = mergeList(ret, it);
}
return ret;
} ListNode * mergeList(ListNode * head1, ListNode * head2)
{
if(!head1) return head2;
if(!head2) return head1;
ListNode * head = new ListNode(-);
head->next = head1;
ListNode * prev = head;
ListNode * tmpNode = NULL;
while(head1 && head2){
if(head1->val < head2->val){
prev = prev->next;
head1 = head1->next;
}else{
tmpNode = head2->next;
prev->next = head2;
head2->next = head1;
prev = head2;
head2 = tmpNode;
}
}
if(head2){
prev->next = head2;
}
return head->next;
}
};

下面是用堆来做的,先建立一个小堆,找到做小元素。将其merge到一个链表里面。如果后面还有元素,再将其放到堆中。代码如下:

 /**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
static bool Comp(ListNode * l1, ListNode * l2)
{
if(l1->val < l2->val)
return false;
return true;
} ListNode* mergeKLists(vector<ListNode*>& lists) {
vector<ListNode *> removeNullList;
removeNullList.reserve(lists.size());
for(auto it = lists.begin(); it != lists.end(); ++it){
if(*it != NULL)
removeNullList.push_back(*it);
}
if(removeNullList.size() == ) return NULL; //首先去除Null节点
make_heap(removeNullList.begin(), removeNullList.end(), Comp);
ListNode * helper = new ListNode(-);
ListNode * tail = helper;
ListNode * minNode = NULL;
while(!removeNullList.empty()){
pop_heap(removeNullList.begin(), removeNullList.end(), Comp);
minNode = removeNullList[removeNullList.size()-];
removeNullList.pop_back();
tail->next = minNode;
tail = tail->next;
if(minNode->next){//如果后面还有list的话,再次入堆
removeNullList.push_back(minNode->next);
make_heap(removeNullList.begin(), removeNullList.end(), Comp);
}
}
return helper->next;
}
};

LeetCode OJ:Merge k Sorted Lists(归并k个链表)的更多相关文章

  1. [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 ...

  2. [leetcode]23. Merge k Sorted Lists归并k个有序链表

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. I ...

  3. [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 ...

  4. [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 ...

  5. [LeetCode] Merge k Sorted Lists 合并k个有序链表

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 这 ...

  6. [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 ...

  7. Leetcode 23.Merge Two Sorted Lists Merge K Sorted Lists

    Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The new list shoul ...

  8. 【LeetCode】23. Merge k Sorted Lists 合并K个升序链表

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:合并,链表,单链表,题解,leetcode, 力扣,Py ...

  9. [Leetcode] Merge k sorted lists 合并k个已排序的链表

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 思 ...

  10. [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 ...

随机推荐

  1. NC审批流开发流程

            1.新建的是数据库表结构中一定要有                          [审批人.                            制单人.             ...

  2. java中hashSet原理

    转自: http://blog.csdn.net/guoweimelon/article/details/50804799 HashSet是JavaMap类型的集合类中最常使用的,本文基于Java1. ...

  3. path.resolve()和path.join()

    resolve 作用:path.resolve() 该方法将一些的 路径/路径段 解析为绝对路径. 语法:path.resolve([...paths]) 说明: ...paths <strin ...

  4. [原创]css中a标签去掉锚点文本下划线

    我对博客的认识是:记录问题,解决问题,分享知识.如果有轮子,我不需要造轮子. 1.问题解决方式: 设置属性:text-decoration:none; 2.更多属性参数参考 text-decorati ...

  5. 【DeepLearning学习笔记】Neurons神经元

    今天找到一个比较好的deep learning的教材:Neural Networks and Deep Learning 对神经网络有详细的讲解,鉴于自己青年痴呆,还是总结下笔记吧=.= Percep ...

  6. TypeScript 3.3来了!快看看有什么新功能

    翻译:疯狂的技术宅原文:https://github.com/Microsoft/TypeScript/wiki/What's-new-in-TypeScript 本文首发微信公众号:jingchen ...

  7. 20145302张薇《Java程序设计》第八周学习总结

    20145302 <Java程序设计>第八周学习总结 教材学习内容总结 第十五章 日志API简介 使用日志的起点是Logger类,要取得Logger类,必须使用Logger的静态方法get ...

  8. DCU项目总结

    1.什么是DCU 在某些基站无法覆盖的地方,如大型体育馆内部1楼.2楼..,此时通过DCU为这些地方提供信号 2.DCU组成 3.我们需要做的 PC通过进入UMPT网关,在一个网页中使用自定义指令集控 ...

  9. [BZOJ1026]windy数

    Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? In ...

  10. 源码安装GCC-4.9.2

    本文参考:http://cuchadanfan.blog.51cto.com/9940284/1689556  感谢原作者的分享! 首先安装基础包,安装网络依赖的时候要用 [root@localhos ...