leetcode刷题23. 合并K个升序链表 简单解法

题目要求:

首先链表class已经定义好了,参数给的是每个链表的头节点,所以使用java自带的优先级队列来替换暴力的装入集合后排序

大致实现思路为:把N个链表的头节点都装入优先级队列,优先级队列会按实现的比较器把最小的元素放在最上面,然后取出一个元素把它加入新链表并把它在原链表里的元素加入优先级队列

代码:

class Solution {

    public ListNode mergeKLists(ListNode[] lists) {

        if(lists == null){

            return null;

        }

/**
 * 使用java的优先级队列把每个数组的头节点装入
 */

        PriorityQueue<ListNode> heap = new PriorityQueue<>(new ListNodeComparator());

        for(int i=0;i<lists.length;i++){

            if(lists[i]!=null){

                heap.add(lists[i]);

            }

        }

        if(heap.isEmpty()){

            return null;

        }

        ListNode head = heap.poll();//取出最小的作为头节点返回

        ListNode last = head;

        if(last.next!=null){

            heap.add(last.next);

        }

        while(!heap.isEmpty()){

            ListNode cur = heap.poll();//不停的取出优先级队列中最小的节点,

            last.next = cur;//把被取出的节点加在最后一个元素后面

            last = cur;//刚刚被加上去的节点成为最后一个元素

            if(cur.next!=null){

//判断刚刚操作的元素在原链表之后还有节点吗,有就加入优先级队列,顶替它空掉的位置

                heap.add(cur.next);

            }

        }

        return head;

    }

/**
 * 实现一个比较器给优先级队列比大小
 */

    public static class ListNodeComparator implements Comparator<ListNode>{

        @Override

        public int compare(ListNode o1, ListNode o2) {

            return o1.val - o2.val; //升序

        }

    }

}

结果:算法复杂度为O(nlogn) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值