leetcode: Merge k Sorted Lists

这道题借鉴了一下别人的写法。

首先用堆是毫无疑问的,用堆找最值,可以讲时间复杂度将为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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值