【Leetcode】【Hard】Merge k Sorted Lists
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的更多相关文章
- 【leetcode】Merge k Sorted Lists
Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and descr ...
- 【LeetCode练习题】Merge k Sorted Lists
Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and descr ...
- [Leetcode][Python]23: Merge k Sorted Lists
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 23: Merge k Sorted Listshttps://oj.leet ...
- 蜗牛慢慢爬 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之“链表”: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 ...
- LeetCode: Merge k Sorted Lists 解题报告
Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and descr ...
- 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 ...
- LeetCode 023 Merge k Sorted Lists
题目要求:Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and ...
- 23. Merge k Sorted Lists - LeetCode
Question 23. Merge k Sorted Lists Solution 题目大意:合并链表数组(每个链表中的元素是有序的),要求合并后的链表也是有序的 思路:遍历链表数组,每次取最小节点 ...
- Merge k Sorted Lists
1. Merge Two Sorted Lists 我们先来看这个 问题: Merge two sorted linked lists and return it as a new list. The ...
随机推荐
- xpath表达式,提取标签下的全部内容(将其他标签过滤)
例如要提取span下的内容 //div[@class="content"]/span 正确的其中一种写法如下data = response.xpath('//div[@class= ...
- JQuery之正则表达式
1.定义正则表达式 /.../ 用于定义正则表达式 /.../g 表示全局匹配 /.../i 表示不区分大小写 /.../m 表示多行匹配 2.匹配正则表达式 非全局模式,不分组 var patte ...
- sqlserver 加内置dll的使用内存
- php乱码解决
代码示例: <?phpheader("Content-type: text/hml; charset=utf-8");echo "holl 欢迎光临小站,现在正在建 ...
- 十步图解CSS的position
CSS的positon,我想做为一个Web制作者来说都有碰到过,但至于对其是否真正的了解呢?那我就不也说了,至少我自己并不非常的了解其内核的运行.今天在Learn CSS Positioning in ...
- 解决IE上登陆oracle OEM时报:“证书错误,导航已阻止”的错误
今天在IE上登陆OEM时,报证书错误,导航已阻止,我选择:继续浏览此网站(不推荐),但是点了之后还没有反应,在网上搜了很多,原因基本都是windows的问题,最后发现问题是:oracle oem证书的 ...
- linux shell 去重 uniq和sort的区别
sort -u 和 uniq都能起到删除重复信息的功能,那么他们的区别究竟在哪呢?$ cat test jasonjasonjasonfffffjason 下面分别执行三个命 ...
- 《Cracking the Coding Interview 》之 二叉树的创建 与 遍历(非递归+递归version)
#include <iostream> #include <cstdio> #include <vector> #include <stack> #de ...
- 高版本Chrome不支持showModalDialog
高版本Chrome不支持window.showModalDialog,可用window.open代替 var url = "https://www.baidu.com"; var ...
- 第二节 初识 python
Python的由来 在1989年12月时,吉多·范罗苏姆——龟叔,想寻找一门“课余”编程项目来打发圣诞节前后的时间.Guido决定为当时正构思的一个新的脚本语言写一个解释器,它是ABC语言(教学语言. ...