//给你一个链表数组,每个链表都已经按升序排列。
//
// 请你将所有链表合并到一个升序链表中,返回合并后的链表。
//
//
//
// 示例 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 = [[]]
//输出:[]
//
//
//
//
// 提示:
//
//
// k == lists.length
// 0 <= k <= 10^4
// 0 <= lists[i].length <= 500
// -10^4 <= lists[i][j] <= 10^4
// lists[i] 按 升序 排列
// lists[i].length 的总和不超过 10^4
//
// Related Topics 堆 链表 分治算法
// 👍 1053 👎 0
//leetcode submit region begin(Prohibit modification and deletion)
import java.util.Comparator;
import java.util.PriorityQueue;
/**
- 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; }
- }
*/
解题思路
1.把每个链表的头加入堆中。使用PriporityQueue,默认使小顶堆。他会帮你把序排好。
2.弹出,此时找到头结点,然后来到弹出结点的下一个结点。
3。加入堆中,依次循环,知道堆中数据为空。合并结束。
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
PriorityQueue<ListNode> queue=new PriorityQueue<ListNode>(new Comparator<ListNode>() {
@Override
public int compare(ListNode o1, ListNode o2) {
return o1.val-o2.val;
}
});
for(int i=0;i<lists.length;i++){
if(lists[i]!=null){
queue.add(lists[i]);
}
}
if(queue.isEmpty()) return null;
ListNode head=queue.poll();
ListNode pre=head;
if(pre.next!=null){
queue.add(pre.next);
}
while(!queue.isEmpty()){
ListNode cur=queue.poll();
pre.next=cur;
pre=cur;
if(cur.next!=null){
queue.add(cur.next);
}
}
return head;
}
}