这道题借鉴了一下别人的写法。
首先用堆是毫无疑问的,用堆找最值,可以讲时间复杂度将为LogN。
java里的堆用PriorityQueue实现,实现的时候,要自己写Comparator接口的方法实现(匿名类实现接口)。
因为leetcode只有一个方法,所以采用一种比较别扭的方法来写PriorityQueue的构造函数。
取PriorityQueue的第一个最大元素,用poll()方法。注意判断链表节点为空的情况。
/**
* Definition for singly-linked list.* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode mergeKLists(ArrayList<ListNode> lists) {
int k=lists.size();
int i;
if(lists==null || k==0)
return null;
PriorityQueue<ListNode> heap=new PriorityQueue<ListNode>(k,new Comparator<ListNode>()
{
public int compare(ListNode l1,ListNode l2){
return l1.val-l2.val;
}
}
);
for(i=0;i<k;i++)
{
if(lists.get(i)!=null)
heap.add(lists.get(i));
}
ListNode rst=new ListNode(0);
ListNode p=rst;
ListNode tmp=null;
while(!heap.isEmpty())
{
tmp=heap.poll();
if(tmp.next!=null)
heap.add(tmp.next);
p.next=tmp;
p=p.next;
p.next=null;
}
return rst.next;
}
}