题目链接:
力扣https://leetcode-cn.com/problems/merge-k-sorted-lists/
【分析】首先可以用合并双链表的方法,挨个合并进去。
class Solution {
public ListNode merge(ListNode p, ListNode q){
ListNode head = new ListNode();
ListNode cur = head;
while(p != null && q != null){
if(p.val < q.val){
cur.next = p;
p = p.next;
}else{
cur.next = q;
q = q.next;
}
cur = cur.next;
}
if(p != null) cur.next = p;
if(q != null) cur.next = q;
return head.next;
}
public ListNode mergeKLists(ListNode[] lists) {
ListNode head = null;
int n = lists.length, i;
for(i = 0; i < n; i++){
head = merge(head, lists[i]);
}
return head;
}
}
【方法二】优先队列,先把各个链表的头放入优先队列中,然后每次取出最小的之后再把他的next也压入队列,直到队列为空。
class Solution {
class Pair implements Comparable<Pair> {
ListNode node;
int val;
public Pair(ListNode node, int val){
this.node = node;
this.val = val;
}
@Override
public int compareTo(Pair p){
if(this.val < p.val) return -1;
return 1;
}
}
public ListNode mergeKLists(ListNode[] lists) {
ListNode head = new ListNode();
PriorityQueue<Pair> queue = new PriorityQueue<>();
int n = lists.length, i;
for(i = 0; i < n; i++){
if(lists[i] != null)
queue.offer(new Pair(lists[i], lists[i].val));
}
ListNode cur = head, node;
Pair p;
while(!queue.isEmpty()){
p = queue.poll();
node = p.node;
cur.next = node;
node = node.next;
if(node != null) queue.offer(new Pair(node, node.val));
cur = cur.next;
}
return head.next;
}
}