题目描述

合并 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

输入:
[
  1->4->5,
  1->3->4,
  2->6
]
输出: 1->1->2->3->4->4->5->6

解题思路

利用分治的思想,划分k个排序链表为两半,递归的合并两部分中的链表。对于单个链表直接返回,对于两个链表调用merge函数,返回合并好的排序链表。

代码

 /**
* 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) {
int mid = lists.size() / ;
ListNode* l1 = mergeK(lists, , mid - );
ListNode* l2 = mergeK(lists, mid, lists.size() - );
return merge(l1, l2);
}
ListNode* mergeK(vector<ListNode*>& lists, int start, int end) {
if(start == end) return lists[start];
else if(start < end){
int mid = (start + end) / ;
ListNode* l1 = mergeK(lists, start, mid);
ListNode* l2 = mergeK(lists, mid + , end);
return merge(l1, l2);
}
else return NULL;
}
ListNode* merge(ListNode* l1, ListNode* l2){
if(l1 == NULL) return l2;
if(l2 == NULL) return l1;
if(l1->val > l2->val) return merge(l2, l1);
ListNode* head = l1;
while(l2 && l1->next){
if(l1->next->val > l2->val){
ListNode* next = l2->next;
l2->next = l1->next;
l1->next = l2;
l2 = next;
}
l1 = l1->next;
}
if(l2) l1->next = l2;
return head;
}
};

最新文章

  1. 【经验之谈】Git使用之Windows环境下配置
  2. nginx concat模块配置 页面返回400 bad request
  3. Android课程---如何用网格视图做出手机桌面APP
  4. 关于学习C++编程语言对中国软件发展的的一些思考!
  5. C#操作word或excel及水晶报表,检索 COM 类工厂中 CLSID 为 {} 的组件时失败,原因是出现以下错误: 80070005
  6. MMORPG大型游戏设计与开发(UI SYSTEM SHOW)
  7. 半透明状态栏(适用于搜索等)CSS样式
  8. Effective Objective-C 2.0 — 第五条用枚举表示状态、选项、状态码 (未看完)
  9. hibernate连接查询
  10. Windows应用替代方案接龙
  11. Remote Direct Memory Access (RDMA)
  12. Can&#39;t create a new thread (errno 11); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug
  13. 【Android Developers Training】 44. 控制你应用的音量和播放
  14. 洛谷P2982 [USACO10FEB]慢下来Slowing down(线段树 DFS序 区间增减 单点查询)
  15. Linux(CentOS)上面搭建Nginx环境
  16. python selenium-webdriver 生成测试报告 (十四)
  17. 【LOJ】#2551. 「JSOI2018」列队
  18. JVM GC总结
  19. Cocos2d-x3.3RC0通过JNI调用Android的Java层URI代码发送短信
  20. 谈谈javascript的函数作用域

热门文章

  1. curl命令用法
  2. c#类生成表
  3. kali工具的总结
  4. mysql数据库:数据类型、存储引擎、约束、
  5. RHEL6使用系统自带多路径软件配置多路径
  6. XML刚学会,怎么又出来个YAML!
  7. View相关面试问题-View绘制面试问题详解
  8. asp.net操纵Oracle存储过程
  9. 解决git提交敏感信息(回退git版本库到某一个commit)
  10. ARDUINO UNO烧录BOOTLOADER