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

解题思路:

1、先取出k个list的首元素,每个首元素是对应list中的最小元素,组成一个具有k个结点的最小堆;o(k*logk)

2、此时堆顶元素就是所有k个list的最小元素,将其pop出,并用此最小元素所在list上的下一个结点(如果存在)填充堆顶,并执行下滤操作,重新构建堆。o(logk)

3、不断执行第二步,直到堆中元素为0。o(nlogk)

最终时间复杂度为o(nlogk),k表示list的个数,n表示所有list总结点数;

解题方法1:

使用C++ make_heap,push_heap,pop_heap函数;

步骤:

1、新建一个结点preHead,指向最终返回结果链表的首结点;新建一个curNode指针,用于操作新建链表;

2、将每个list的首指针装入一个新建的vector v中,注意判断list不为空;

3、调用make_heap函数将这些首指针构造成堆;需要编写greater比较函数;

4、循环操作,只要v不为空:

  (1)取出堆顶,放入新建链表的末端;

  (2)pop_heap,交换当前堆首尾元素,并下滤首元素;

  (3)pop_back,删除v最后一个元素(当前最小元素);

  (4)push_back,将当前最小元素的下一个元素加入堆尾;

  (5)push_heap,对堆尾元素进行上滤;

5、返回preHead->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) { //make_heap
ListNode prehead();
ListNode *curNode = &prehead;
vector<ListNode*> v;
for(int i = ; i < lists.size(); i++){
if (lists[i])
v.push_back(lists[i]);
}
make_heap(v.begin(), v.end(), heapComp); //vector -> heap data strcture while(v.size() > ){
curNode->next = v.front();
pop_heap(v.begin(), v.end(), heapComp);
v.pop_back();
curNode = curNode->next;
if(curNode->next) {
v.push_back(curNode->next);
push_heap(v.begin(), v.end(), heapComp);
}
} return prehead.next;
} static bool heapComp(ListNode* a, ListNode* b) {
return a->val > b->val;
}
};

解题方法2:

使用C++ priority_queue 构建最小堆;

步骤和上述基本一致;

代码

 /**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
struct cmp {
bool operator()(const ListNode *n1, const ListNode *n2) {
return n1->val > n2->val;
}
}; ListNode *mergeKLists(vector<ListNode *> &lists) {
priority_queue<ListNode*, vector<ListNode *>, cmp > heap;
ListNode pre_head();
ListNode *curNode = &pre_head;
for (int i = ; i < lists.size(); i++) {
if (lists[i])
heap.push(lists[i]);
} while (!heap.empty()){
curNode->next = heap.top();
heap.pop();
curNode = curNode->next;
if (curNode->next)
heap.push(curNode->next);
} return pre_head.next;
}
};

【Leetcode】【Hard】Merge k Sorted Lists的更多相关文章

  1. 【leetcode】Merge k Sorted Lists

    Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and descr ...

  2. 【LeetCode练习题】Merge k Sorted Lists

    Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and descr ...

  3. [Leetcode][Python]23: Merge k Sorted Lists

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 23: Merge k Sorted Listshttps://oj.leet ...

  4. 蜗牛慢慢爬 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 ...

  5. LeetCode之“链表”:Merge Two Sorted Lists && Merge k Sorted Lists

    1. Merge Two Sorted Lists 题目链接 题目要求:  Merge two sorted linked lists and return it as a new list. The ...

  6. LeetCode: Merge k Sorted Lists 解题报告

    Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and descr ...

  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 023 Merge k Sorted Lists

    题目要求:Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and ...

  9. 23. Merge k Sorted Lists - LeetCode

    Question 23. Merge k Sorted Lists Solution 题目大意:合并链表数组(每个链表中的元素是有序的),要求合并后的链表也是有序的 思路:遍历链表数组,每次取最小节点 ...

  10. Merge k Sorted Lists

    1. Merge Two Sorted Lists 我们先来看这个 问题: Merge two sorted linked lists and return it as a new list. The ...

随机推荐

  1. makefile学习小结

    =============2016/08/15================ 上午完成makefile的试验,缩短了代码量,现在make强大,有缺省的变量,能自己推导关系,不需要gcc –MM -M ...

  2. VBS 相关知识 笔记

    1.Option Explicit: 必须声明了变量之后才能赋值.  原话:语句在模块级别中使用,强制显式声明模块中的所有变量. w3scholl看到的内容: 变量声明 您可以使用 Dim.Publi ...

  3. Framework7--Test

    <!doctype html> <html> <head> <title>{{title}}</title> <meta charse ...

  4. MS SQL Server之光标、存储过程和触发器

    光标 通常数据库操作被认为是以数据集为基础的操作,但是光标被用于以记录为单位来进行操作,来获取数据库中的数据的子集.光标一般用于过程化程序里的嵌入的SQL语句. 对光标的定义如下: DECLARE C ...

  5. Android菜鸟成长记4-button点击事件

    Button 1.button按钮的创建 一般来说,在我们新建一个Android项目的时候,会有会默认有一个activity_main.xml的文件 如果你在新建项目的时候,把Create Activ ...

  6. jQuery ajax - getScript() 方法

    通过 AJAX 请求来获得并运行一个 JavaScript 文件: HTML 代码: <button id="go">Run</button> <di ...

  7. 修正下载链接的树莓派Flash教程(前置:Chromium浏览器)

    前端时间想在网上搜罗一下树莓派安装Flash的教程,结果到下载插件那里wget总是死活下载不了,后面发现原链接已经404了,在Bing搜索了一番之后发现Flash播放器的网址已经改了.首先安装Chro ...

  8. Android之activity中新建控件

    了解了5大布局,我们会发现这些布局都是静态的,如何让系统自动生成控件呢?这就需要activity来帮忙了 今天我们讲的就是用activity新建布局 用案例来说吧! 实现一个输入行和列自动生成表格并生 ...

  9. Hibernate 根据实体名称得到DB表名以及表对应的Sequence name

    DB: oracle 10g; entityName:com.signaldemand.flank.hibernate.model.实体名 1. 根据实体名获取DB表相对应的表名 Class<? ...

  10. Oracle游标带参数

    Oracle游标是可以带参数的,而SqlServer的游标就不可以了 create or replace procedure a as cursor b(c_id int)is select * fr ...