【Merge K Sorted Lists】cpp
题目:
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
代码:
/**
* 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) {
if (lists.size()==) return NULL;
return Solution::mergeK(lists, , lists.size()-);
}
static ListNode* mergeK(vector<ListNode*>& lists, int begin, int end )
{
if ( begin==end ) return lists[begin];
if ( (begin+)==end ) return Solution::mergeTwo(lists[begin], lists[end]);
int mid = ( begin + end ) / ;
ListNode *firstHalf = Solution::mergeK(lists, begin, mid);
ListNode *secondHalf = Solution::mergeK(lists, mid+, end);
return Solution::mergeTwo(firstHalf, secondHalf);
}
static ListNode* mergeTwo( ListNode *h1, ListNode *h2 )
{
ListNode dummy(-);
ListNode *p = &dummy;
while ( h1 && h2 ){
if ( h1->val<h2->val ){
p->next = h1;
h1 = h1->next;
}
else{
p->next = h2;
h2 = h2->next;
}
p = p->next;
}
p->next = h1 ? h1 : h2;
return dummy.next;
}
};
tips:
多路归并写法。
=================================================
第二次过这道题,第一次没有写成归并的形式,结果超时了。
在网上查了一下这道题的时间复杂度分析:http://www.cnblogs.com/TenosDoIt/p/3673188.html
改成了归并的写法,AC了。
/**
* 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)
{
return Solution::divide(lists, , lists.size()-);
}
ListNode* divide(vector<ListNode*>& lists, int begin, int end)
{
if ( begin>end ) return NULL;
if ( begin==end ) return lists[begin];
int mid = (begin+end)/;
ListNode* l = Solution::divide(lists, begin, mid);
ListNode* r = Solution::divide(lists, mid+, end);
return Solution::merge2Lists(l, r);
}
static ListNode* merge2Lists(ListNode* p1, ListNode* p2)
{
ListNode head();
ListNode* p = &head;
while ( p1 && p2 )
{
if ( p1->val < p2->val )
{
p->next = p1;
p1 = p1->next;
}
else
{
p->next = p2;
p2 = p2->next;
}
p = p->next;
}
p->next = p1 ? p1 : p2;
return head.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)
{
if ( lists.empty() ) return NULL;
int length = lists.size();
while ( length> )
{
int index = ;
int i=;
for ( ; i<length; i=i+)
{
lists[index++] = Solution::merge2Lists(lists[i], lists[i-]);
}
if ( length & ) lists[index++] = lists[i-];
length = index;
}
return lists[];
}
static ListNode* merge2Lists(ListNode* p1, ListNode* p2)
{
ListNode head();
ListNode* p = &head;
while ( p1 && p2 )
{
if ( p1->val < p2->val )
{
p->next = p1;
p1 = p1->next;
}
else
{
p->next = p2;
p2 = p2->next;
}
p = p->next;
}
p->next = p1 ? p1 : p2;
return head.next;
}
};
=====================================================
之前两次过这道题,即使看了上面提到blog的解释,也没太直观理解为什么归并的效率高。
第三次过,有点儿顿悟了:其实就是插入排序和归并排序的效率区别;只不过这次归并的是链表。
【Merge K Sorted Lists】cpp的更多相关文章
- leetcode 【 Merge k Sorted Lists 】python 实现
题目: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexit ...
- 【Merge Two Sorted Lists】cpp
题目: Merge two sorted linked lists and return it as a new list. The new list should be made by splici ...
- leetcode 【 Merge Two Sorted Lists 】 python 实现
题目: Merge two sorted linked lists and return it as a new list. The new list should be made by splici ...
- 【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 ...
- 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][Python]23: Merge k Sorted Lists
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 23: Merge k Sorted Listshttps://oj.leet ...
- 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 ...
随机推荐
- ubuntu 字体 android stuido 汉字 显示 方块
Ubuntu 12.04 LTS 中安装 windows 字体 ubuntu 中的中文字体看着总觉的有点不爽,于是百度了下,这里记录下怎么在 ubuntu 12.04 中安装 windows 字体 ...
- Dev的DocumentManager添加窗体
1.DocumentManager要设置自己的MdiParent属性 2.主窗体设置IsMidContainer为True 3.要生成的窗体设置MdiParent为主窗体 4.正常创建窗体,然后就可以 ...
- laravel5.2 学习之服务提供者
契约接口:app\Contracts\LanguageContract.php <?php namespace App\Contracts; interface LanguageContract ...
- 三种找回 linux root密码
找回 linux root密码的三种方法 第1种方法: 1.在系统进入单用户状态,直接用passwd root去更改2.用安装光盘引导系统,进行linux rescue状态,将原来/分区挂接上来,作法 ...
- apache日志文件详解和实用分析命令
apache日志文件每条数据的请意义,以及一些实用日志分析命令. 一.日志分析 如果apache的安装时采用默认的配置,那么在/logs目录下就会生成两个文件,分别是access_log和error ...
- 【积硅计划】http协议基础
http:超文本传输协议,它允许将超文本标记(html)文档从web服务器传送到浏览器.目前版本HTTP/1.1 http请求过程: proxy:代理服务器,网络信息的中转站.功能如下: ...
- S5PV2210
http://www.doc88.com/p-773451739254.html CAN转换器 CAN总线信息转换输出装置 基于车载CAN总线的倒车雷达单元设计[图] http://www.doc88 ...
- 【微网站开发】之微信内置浏览器API使用
最近在写微网站,发现了微信内置浏览器的很多不称心的地方: 1.安卓版的微信内浏览器底部总是出现一个刷新.前进.后退的底部栏,宽度很大,导致屏幕显示尺寸被压缩 2.分享当前网站至朋友圈时,分享的图片一般 ...
- VS2005内存泄漏检测方法[转载]
一.非MFC程序可以用以下方法检测内存泄露: 1. 程序开始包含如下定义: #ifdef _DEBUG #define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __ ...
- 每日一练--C语言--串
目标 实现串的经典模式匹配算法与KMP算法. 简述 自定义串结构: 串采用定长顺序存储结构,串从下标1开始存储,0下标存储串的实际长度: 匹配成功返回匹配位置,匹配失败返回0. #include &l ...