题目地址:

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 解题报告的更多相关文章

  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 Two Sorted Lists 解题报告

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

  3. LeetCode Merge k Sorted Lists 解决报告

    https://oj.leetcode.com/problems/merge-k-sorted-lists/ 归并K已经整理阵列,和分析算法的复杂. 解决报告:无论是不考虑优化,最简单的实现是要重新走 ...

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

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

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

  6. Merge k Sorted Lists

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

  7. 71. Merge k Sorted Lists

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

  8. 【leetcode】Merge k Sorted Lists

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

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

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

随机推荐

  1. java学习笔记12--国际化

    java学习笔记12--国际化 国际化的操作就是指一个程序可以同时适应多门语言,即:如果现在程序者是中国人,则会以中文为显示文字,如果现在程序的使用者是英国人,则会以英语为显示的文字,也就是说可以通过 ...

  2. 解决CentOS无法显示中文字体 | 系统运维 | Web2.0

    解决CentOS无法显示中文字体 | 系统运维 | Web2.0 About Me    博客园    devops    前端    张家港水蜜桃 傍晚好! 2013年09月12日 17:56:08 ...

  3. 【剑指offer】二叉树的镜像

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/25915971 题目描写叙述: 输入一个二叉树,输出其镜像. 输入: 输入可能包括多个測试例 ...

  4. UVa 10286 - Trouble with a Pentagon

    题目:如图在正五边形中画一个正方形,一直正五边形边长,求正方形边长. 分析:计算几何,解析几何.求出边长的比例关系带入求解就可以. 设正五边形边长为1,在顶点建立直角坐标系,则左上角坐标为:B(-co ...

  5. hdu 1224 Free DIY Tour(最长的公路/dp)

    http://acm.hdu.edu.cn/showproblem.php? pid=1224 基础的求最长路以及记录路径. 感觉dijstra不及spfa好用,wa了两次. #include < ...

  6. drupal form 中图片上传

    1.创建url 链接到form $items['qianfeng/add'] = array(     'title' => t('加入信息'),     'page callback' =&g ...

  7. _tcscat在Debug和Release根据问题

    背景: 因此,例如,在下面的代码段,作用是得到的路径当前程序(C:\work\A.exe),然后"A.exe"拆除,组装的"C:\work\inject.dll" ...

  8. 【ThinkingInC++】52、函数内部的静态变量

    /** * 书本:[ThinkingInC++] * 功能:函数内部的静态变量 * 时间:2014年9月17日18:06:33 * 作者:cutter_point */ #include " ...

  9. 2014ACM/ICPC亚洲区西安站 F题 color (组合数学,容斥原理)

    题目链接:传送门 题意: n个格子排成一行.我们有m种颜色.能够给这些格子涂色,保证相邻的格子的颜色不同 问,最后恰好使用了k种颜色的方案数. 分析: 看完题目描写叙述之后立刻想到了一个公式 :C(m ...

  10. Catch Up 朋友小聚 - 地道英语 - BBC Learning English BBC英语教学 - 爱思英语网

    Catch Up 朋友小聚 - 地道英语 - BBC Learning English BBC英语教学 - 爱思英语网 Catch Up 朋友小聚 分享到: 新浪微博 QQ空间 腾讯微博 微信 更多 ...