zoukankan      html  css  js  c++  java
  • 23. Merge k Sorted Lists via Java

    有序列表merge核心思想-->谁小就选谁加入结果

    所以这道题的最核心问题也就找到了,就是要找到任意时刻的最小元素。所以需要维持一个数据结构,随时返回其中最小的元素,也就是最堆

    然后这道题的难点就变成了写最小堆的comparator

    下方代码中有两种我比较喜欢的方式

    class Solution {
        public ListNode mergeKLists(ListNode[] lists) {
            if(lists==null || lists.length==0){
                return null;
            }
            ListNode res = new ListNode(0);
            ListNode cur = res;
            // lambda instead of anonymous comparator class
            PriorityQueue<ListNode> pq = new PriorityQueue<>((ListNode l1, ListNode l2)->l1.val-l2.val);
            // classic comparator
            // PriorityQueue<ListNode> pq = new PriorityQueue<>(new Comparator<ListNode>(){
            //     @Override 
            //     public int compare(ListNode i, ListNode j) { 
            //         if(i.val==j.val){ 
            //             return 0;
            //         }
            //         return i.val<j.val?-1:1;
            //     }});
            for(int i = 0; i<lists.length; i++){
                if(lists[i]!=null){
                    pq.add(lists[i]);
                }
            }
            while(!pq.isEmpty()){
                cur.next = pq.poll();
                if(cur.next.next!=null){
                    pq.offer(cur.next.next);
                }
                cur = cur.next;
            }
            cur.next = null;
            return res.next;
        }
    }

    time: 对二叉堆进行n次poll()操作,每次复杂度为O(lgk),其中k为初始链表数组中链表数,即最终结果为O(nlgk)

    space:二叉堆:O(k) 返回结果O(n) 综合O(n+k)

  • 相关阅读:
    [日常摸鱼]最小费用最大流
    [日常摸鱼]loj6000「网络流 24 题」搭配飞行员
    [日常摸鱼]最大流
    [日常摸鱼]poj1741Tree-点分治
    [游记]FCS&FJOI2018滚粗记
    TOJ-1469-Wooden Sticks(贪心)
    TOJ-1188-田忌赛马(贪心)
    TOJ3988-Password(已知二叉树前中序求后序)
    枚举HDU-1172猜数字
    模拟题 HDU3052 VIM
  • 原文地址:https://www.cnblogs.com/zg1005/p/11902327.html
Copyright © 2011-2022 走看看