1. 题目描述
给你一个链表数组,每个链表都已经按升序排列
请你将所有链表合并到一个升序链表中,返回合并后的链表
- 示例 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 = [[]]
输出:[]
2. 解题思路
- 可以借鉴 21 合并两个有序链表 经验, 遍历数组中的链表,两两进行合并,再把结果与下一个链表进行合并,但时间复杂度是
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if (null == lists || lists.length == 0) {
return null;
}
if (lists.length == 1) {
return lists[0];
}
int k = lists.length;
while (k > 1) {
int idx = 0;
for (int i = 0; i < k; i += 2) {
if (i == k - 1) {
lists[idx++] = lists[i];
} else {
lists[idx++] = mergeNode(lists[i], lists[i + 1]);
}
}
k = idx;
}
return lists[0];
}
public ListNode mergeNode(ListNode l1, ListNode l2) {
ListNode result = new ListNode(-999);
ListNode current = result;
while (null != l1 && null != l2 ) {
if (l1.val <= l2.val) {
current.next = l1;
l1 = l1.next;
} else {
current.next = l2;
l2 = l2.next;
}
current = current.next;
}
current.next = null == l1 ? l2 : l1;
return result.next;
}
}