1. 题目描述
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[ 1->4->5, 1->3->4, 2->6]输出: 1->1->2->3->4->4->5->6来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/merge-k-sorted-lists
2. 解题思路
3. 测试结果
解法一、顺序合并
解法二、分治合并
4. 顺序合并
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) { if (!l1) return l2; if (!l2) return l1; struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode)), * tail = head; while (l1 && l2) { if (l1->val < l2->val) { tail->next = l1; l1 = l1->next; } else { tail->next = l2; l2 = l2->next; } tail = tail->next; } if (l1) tail->next = l1; else if (l2) tail->next = l2; tail = head; head = head->next; free(tail); return head;}struct ListNode* mergeKLists(struct ListNode** lists, int listsSize) { if (listsSize == 0) return NULL; struct ListNode* res = *lists; for (int i = 1; i < listsSize; i++) { if(lists[i] != NULL) res = mergeTwoLists(res, lists[i]); } return res;}
5. 分治合并
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) { if ((!l1) || (!l2)) return l1 ? l1 : l2; struct ListNode head; head.next = NULL; struct ListNode* tail = &head; while (l1 && l2) { if (l1->val < l2->val) { tail->next = l1; l1 = l1->next; } else { tail->next = l2; l2 = l2->next; } tail = tail->next; } tail->next = l1 ? l1 : l2; return head.next;}struct ListNode* merge(struct ListNode** lists, int left, int right) { if (left == right) return lists[left]; if (left > right) return NULL; int mid = (left + right) >> 1; struct ListNode* p1 = merge(lists, left, mid); struct ListNode* p2 = merge(lists, mid + 1, right); return mergeTwoLists(p1, p2);}struct ListNode* mergeKLists(struct ListNode** lists, int listsSize) { if (listsSize == 0) return NULL; return merge(lists, 0, listsSize - 1);}
6. 复杂度分析
解法一、顺序合并
时间复杂度:O(n*n)
空间复杂度:O(1)
解法二、分治合并
时间复杂度:O(nlogn)
空间复杂度:O(1)
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容- Java 构造函数的作用究竟是什么?(java构造函数的作用是什么)
- 如何确定 Java 临时变量的类型和值?(Java临时变量的类型和值如何确定)
- Java 线程池常见问题及应对措施有哪些?(java线程池会出现的问题有哪些)
- 如何使用 redis 可视化工具的数据分析功能?(redis可视化工具的数据分析功能如何)
- 如何调用 Java 的 concat 方法?(java concat方法怎么调用)
- Java 中 System.in 的具体作用究竟是什么?(java中system.in的作用是什么)
- Java 中如何声明私有变量?(java私有变量如何声明)
- Java webservice 接口如何进行调用?(Java webservice接口如何调用)
- Java 下载文件的最佳实践究竟是什么?(java下载文件的最佳实践是什么)
- Java 如何实现拓扑图?详细步骤及代码示例(java如何实现拓扑图)
猜你喜欢
AI推送时光机leetcode23. 合并K个排序链表
后端开发2023-06-03
c++如何合并K个排序链表
后端开发2023-06-02
C++怎么实现合并k个有序链表
后端开发2023-06-19
C++实现LeetCode(23.合并k个有序链表)
后端开发2024-04-02
怎么用C++实现合并k个有序链表
后端开发2023-06-20
C++怎么合并两个排序的链表
后端开发2023-06-22
TypeScript合并两个排序链表的方法详解
后端开发2024-04-02
C++解决合并两个排序的链表问题
后端开发2024-04-02
python怎么合并两个列表并排序
后端开发2023-08-15
利用Java怎么合并递增排序链表
后端开发2023-05-31
Java实现合并多个升序链表
后端开发2023-05-16
Java如何实现合并多个升序链表
后端开发2023-07-06
C/C++合并两个升序链表的方式
后端开发2024-04-02
Java有序链表怎么合并
后端开发2023-07-06
C++归并法+快速排序实现链表排序的方法
后端开发2024-04-02
java怎么合并两个数组并排序
后端开发2023-09-29
咦!没有更多了?去看看其它编程学习网 内容吧