【原创】leetCodeOj --- Merge k Sorted Lists 解题报告
题目地址:
https://oj.leetcode.com/problems/merge-k-sorted-lists/
题目内容:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
方法:
用最小堆来做就可以了。第一轮将链表所有头结点插入堆中,当堆非空时,弹出一个结点加入输出链表,若该结点有后继结点,则后继结点入堆。
复杂度分析:
设有k个链表,每个链表有n个结点。
则堆的大小最多为k。
每个结点都要入一次堆并出一次堆,入堆的复杂度为lgk,出堆时为了维护堆的性质复杂度也是lgk
一共有k * n个结点
所以,总的复杂度为O(k * n * lgk)
如果简单粗暴直接堆排序,那么堆的大小就是k * n,入堆出堆的复杂度就是lg(k * n),要大不少。
如果直接按归并排序那样简单粗暴的归并,那么每轮中获得获胜结点的复杂度是k,由于每轮只产生一个获胜结点,所以一共有 k * n轮,那么复杂度就是O(k * k * n)
AC代码:(直接手写heap,免得重载运算符)
class Solution {
class MergeHeap
{
public:
MergeHeap()
{
heap.push_back(NULL);
}
bool isEmpty()
{
return heap.size() <= ; // 0号元素永远为NULL
}
void insert(ListNode *tmp)
{
if (tmp == NULL)
return;
heap.push_back(tmp);
mergeInsert();
}
ListNode *pop()
{
if (this->isEmpty())
return NULL;
int last = heap.size() - ;
ListNode *tmp = heap[];
heap[] = heap[last];
heap.pop_back();
if (!this->isEmpty())
mergeDelete();
return tmp;
}
private:
vector<ListNode *> heap;
void mergeDelete(int start)
{
int last = heap.size() - ;
ListNode *tmp = heap[start];
int lchild = start * ;
int rchild = start * + ;
int target = ; // marked win sub-tree
if (lchild <= last && rchild <= last)
{
target = heap[rchild]->val > heap[lchild]->val ? lchild : rchild;
}
else if (lchild <= last)
{
target = lchild;
}
else if (rchild <= last)
target = rchild;
if (target)
{
if (heap[target]->val < heap[start]->val)
{
heap[start] = heap[target];
heap[target] = tmp;
mergeDelete(target);
}
}
}
void mergeInsert()
{
int last = heap.size() - ;
int pare = last / ;
while (pare != )
{
if (heap[pare]->val > heap[last]->val)
{
ListNode *tmp = heap[pare];
heap[pare] = heap[last];
heap[last] = tmp;
}
else
break;
last = pare;
pare /= ;
}
}
};
public:
ListNode *mergeKLists(vector<ListNode *> &lists) {
MergeHeap myheap;
int len = lists.size();
if (!len)
return NULL;
for (int i = ;i < len;i++)
myheap.insert(lists[i]);
ListNode *head = NULL;
ListNode *tmp = NULL;
ListNode *tail = NULL;
while (!myheap.isEmpty())
{
tmp = myheap.pop();
if (!head) // init output list.
{
head = tmp;
tail = tmp;
}
else
{
tail->next = tmp;
tail = tmp;
}
if (tmp->next)
{
myheap.insert(tmp->next);
}
}
return head;
}
};
【原创】leetCodeOj --- 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 Two Sorted Lists 解题报告
Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The new list shoul ...
- LeetCode Merge k Sorted Lists 解决报告
https://oj.leetcode.com/problems/merge-k-sorted-lists/ 归并K已经整理阵列,和分析算法的复杂. 解决报告:无论是不考虑优化,最简单的实现是要重新走 ...
- 【LeetCode练习题】Merge k Sorted Lists
Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and descr ...
- [Swift]LeetCode23. 合并K个排序链表 | Merge k Sorted Lists
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...
- Merge k Sorted Lists
1. Merge Two Sorted Lists 我们先来看这个 问题: Merge two sorted linked lists and return it as a new list. The ...
- 71. 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 ...
随机推荐
- 一款新型的智能家居WiFi选择方案——SimpleWiFi在无线智能家居中的应用
一款新型的智能家居WiFi选择方案——SimpleWiFi在无线智能家居中的应用 先上图: 随着科学技术的不断发展,局域网也正逐渐向无线化,多网合一的方向发展,在这个多网合一快速发展过程中,带 ...
- GMM高斯混合模型学习笔记(EM算法求解)
提出混合模型主要是为了能更好地近似一些较复杂的样本分布,通过不断添加component个数,能够随意地逼近不论什么连续的概率分布.所以我们觉得不论什么样本分布都能够用混合模型来建模.由于高斯函数具有一 ...
- NET Core 1.0 RC2
NET Core 1.0 RC2 历险之旅 文章背景:对于.NET Core大家应该并不陌生, 从它被 宣布 到现在已经有1-2年的时间了,其比较重要的一个版本1.0 RC2 也即将发布..Net C ...
- FOJ 1591 —— Coral的烦恼
#include<stdio.h> int main() { __int64 n,i,sum,l,r; while(scanf("%I64d",&n)!=EOF ...
- mini2440驱动奇谭——ADC驱动与測试(动态挂载驱动)
博客:http://blog.csdn.net/muyang_ren 实现功能:开发板动态载入adc驱动模块并能通过測试程序 系统:Ubuntu 14.04 驱动交叉编译内核:linux-2. ...
- HDSF主要节点解说(二)工作原理
HDFS(Hadoop Distributed File System )Hadoop分布式文件系统. 是依据google发表的论文翻版的.论文为GFS(Google File System)Goog ...
- I2C操作笔记——以 AT24C04为例
1.前言 对于大多数project师而言,I2C永远是一个头疼的问题.相比UART和SPI而言,I2C的时序要复杂一些,I2C组合变化也丰富一些.在这里以AT24C04为例说明I2C使用过程中 ...
- CSharp Oracle 登陆
=======后台Oracle存储过程================ 1.创建表 --判读表存在先删除begin EXECUTE IMMEDIATE 'DROP TABLE student'; ...
- Linux如何查找大文件或目录总结及在全部目录中查找
在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在Linux系统中,如何去搜索一些比较大的文件呢?下面我整理了一下在Linux系统中如何查找大文件或文件 ...
- android IllegalStateException
由于android的线程非安全,直接在子线程中对UI进行更新是不被允许的,同样在常用的 适配器+List<E> 组合中,子线程直接更新与适配器绑定的List,便可能产生IllegalSta ...