LeetCode 23. 合并K个排序链表(Merge k Sorted Lists)
2024-10-07 01:15:13
题目描述
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
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;
}
};
最新文章
- 【经验之谈】Git使用之Windows环境下配置
- nginx concat模块配置 页面返回400 bad request
- Android课程---如何用网格视图做出手机桌面APP
- 关于学习C++编程语言对中国软件发展的的一些思考!
- C#操作word或excel及水晶报表,检索 COM 类工厂中 CLSID 为 {} 的组件时失败,原因是出现以下错误: 80070005
- MMORPG大型游戏设计与开发(UI SYSTEM SHOW)
- 半透明状态栏(适用于搜索等)CSS样式
- Effective Objective-C 2.0 — 第五条用枚举表示状态、选项、状态码 (未看完)
- hibernate连接查询
- Windows应用替代方案接龙
- Remote Direct Memory Access (RDMA)
- 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
- 【Android Developers Training】 44. 控制你应用的音量和播放
- 洛谷P2982 [USACO10FEB]慢下来Slowing down(线段树 DFS序 区间增减 单点查询)
- Linux(CentOS)上面搭建Nginx环境
- python selenium-webdriver 生成测试报告 (十四)
- 【LOJ】#2551. 「JSOI2018」列队
- JVM GC总结
- Cocos2d-x3.3RC0通过JNI调用Android的Java层URI代码发送短信
- 谈谈javascript的函数作用域