问题描述:
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 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 = [[]]
输出:[]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-k-sorted-lists
解决思路:
1.新建三个链表,一个负责保存头部最后返回,一个负责往后移动,搜罗数据,一个负责装填临时最小值。
2.遍历集合中链表所有元素,谁小谁装入结果中,然后改元素后移,结果指针后移
3.最后只剩一个链表不为空时,直接接到结果尾部然后返回
/*
*作者:赵星海
*时间:2020/9/1 10:17
*用途:合并K个升序链表
*/
ListNode resultHead = null;//结果头
ListNode result = null;//结果
ListNode temporary = null;//临时最小值
public ListNode mergeKLists(ListNode[] lists) {
int min = 0;
int count = 0;//不为空的数量
temporary = null;
for (int i = 0; i < lists.length; i++) {
if (lists[i] != null) {
count++;
if (temporary == null || lists[i].val <= temporary.val) {
min = i;
temporary = lists[min];
}
}
}
if (temporary != null) {
if (resultHead == null) {
result = temporary;
resultHead = result;
} else {
result.next = temporary;
result = result.next;//结果头后移
}
lists[min] = lists[min].next;//添加到里面的数后移
//list不为空 且 剩余孩子数量不为1 则 继续递归
if (count != 1) {
mergeKLists(lists);
}
}
return resultHead;
}