leetcode23-合并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 = [[]]
输出:[]
示例 4:
输入:lists = [[],[],[1,2]]
输出:[1,2]
思路:
参考:合并两个有序链表
- 使用优先队列实现的小顶堆,进行存储链表节点
- 合并K个有序链表,只需要:
1.先把集合中[]空的链表先过滤掉
2.然后把所有[1->2->3]、[7->8]、- - -所有链表的头节点加入队列即可
3.后续流程完全同理合并2个有序链表
public class MergeKNumLink {
public static void main(String[] args) {
ListNode l1 = new ListNode(1);
ListNode l11 = new ListNode(4);
ListNode l12 = new ListNode(5);
l1.next = l11; l11.next = l12;
ListNode l2 = new ListNode(1);
ListNode l21 = new ListNode(3);
ListNode l22 = new ListNode(4);
l2.next = l21; l21.next = l22;
ListNode l3 = new ListNode(2);
ListNode l31 = new ListNode(6);
l3.next = l31;
ListNode[] arr = {l1, l2, l3};
ListNode res = mergeKLists(arr);
System.out.println(res);
}
public static ListNode mergeKLists(ListNode[] arr) {
if (arr == null || arr.length == 0) {
return null;
}
// 1.过滤掉所有为空的链表
List<ListNode> list = Stream.of(arr).filter(Objects::nonNull).collect(Collectors.toList());
ListNode res = new ListNode(0);
ListNode temp = res;
Queue<ListNode> queue = new PriorityQueue<>(Comparator.comparingInt(o -> o.val));
// 2.将所有链表的头节点加入队列
queue.addAll(list);
//3.同理合并2个有序链表
while (queue.size() > 0) {
ListNode kThSmallerNode = queue.poll();
temp.next = kThSmallerNode;
temp = temp.next;
if (kThSmallerNode.next != null) {
queue.add(kThSmallerNode.next);
}
}
return res.next;
}
}