23. 合并 K 个升序链表
题目描述
给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。
(图片来源网络,侵删)
示例 1:
输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下: [
1->4->5, 1->3->4, 2->6 ] 将它们合并到一个有序链表中得到。 1->1->2->3->4->4->5->6
示例 2:
输入:lists = []
输出:[]
示例 3:
输入:lists = [[]]
输出:[]
题解
输入一个链表数组,数组中的每一个元素都是链表,并将所有的链表都合并为一个升序链表。
这个题目有多个解法,但是归根到底都是使用多次两两合并。
解法:
使用类似二分查找的方法,将数组一分为二,如此递归,直到分出的数组中只有一个或两个链表,然后进行两两合并。
如:lists=[x1, x2,…x(k/2-1), xk/2, …, xk-1, xk]
先将lists分为 [x1, x2,…x(k/2-1)] [ xk/2, …, xk-1, xk]
再对得到的两个新数组一分为二,直到得到:[x1, x2] [x3, x4]…[xk-1, xk ]
然后对其进行两两合并,如此递归得到最后的结果
代码:
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
return merge(lists, 0, lists.length - 1);
}
public ListNode merge(ListNode[] lists, int l, int r) {
if (l == r) {
// 若数组只有一个元素,则直接返回该元素
return lists[l];
}
if (l > r) {
// 若数组为空,则返回空
return null;
}
// 除2取整, 拿到中间元素的索引
int mid = (l + r) >> 1;
return mergeTwoLists(merge(lists, l, mid), merge(lists, mid + 1, r));
}
public ListNode mergeTwoLists(ListNode a, ListNode b) {
if (a == null || b == null) {
return a != null ? a : b;
}
ListNode head = new ListNode(0);
ListNode tail = head, aPtr = a, bPtr = b;
while (aPtr != null && bPtr != null) {
if (aPtr.val
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!
