• 23. Merge k Sorted Lists


    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

    本题目我第一个想到了用小顶堆来做,不是很难,直接上代码:

    /**

     * Definition for singly-linked list.

     * public class ListNode {

     *     int val;

     *     ListNode next;

     *     ListNode(int x) { val = x; }

     * }

     */

    public class Solution {

        public ListNode mergeKLists(ListNode[] lists) {

            if(lists==null||lists.length==0) return null;

            PriorityQueue<ListNode> q = new PriorityQueue<ListNode>(lists.length,new Comparator<ListNode>(){

                public int compare(ListNode a,ListNode b){

                    return a.val-b.val;

                }

            });

            for(ListNode l:lists){

                if(l!=null) q.offer(l);

            }

            ListNode node = new ListNode(0);

            ListNode dummy = node;

            while(!q.isEmpty()){

                ListNode next = q.poll();

                node.next = next;

                node = node.next;

                next = next.next;

                if(next!=null) q.offer(next);

            }

            return dummy.next;

        }

    }

    后来看了标签,发现还可以用分治的方法来做(也就是递归),代码如下:

    /**

     * Definition for singly-linked list.

     * public class ListNode {

     *     int val;

     *     ListNode next;

     *     ListNode(int x) { val = x; }

     * }

     */

    public class Solution {

        public ListNode mergeKLists(ListNode[] lists) {

            if(lists.length==0) return null;

            if(lists.length==1) return lists[0];

            if(lists.length==2) return mergeTwoLists(lists[0],lists[1]);

            return mergeTwoLists(mergeKLists(Arrays.copyOfRange(lists,0,lists.length/2)),mergeKLists(Arrays.copyOfRange(lists,lists.length/2,lists.length)));

        }

        public ListNode mergeTwoLists(ListNode l1,ListNode l2){

            ListNode node = new ListNode(0);

            ListNode dummy =node;

            while(l1!=null&&l2!=null){

                if(l1.val<l2.val){

                    ListNode next = l1;

                    node.next = next;

                    node = node.next;

                    l1 = l1.next;

                }else{

                    ListNode next = l2;

                    node.next = next;

                    node = node.next;

                    l2 = l2.next;

                }

            }

            if(l1!=null){

                node.next = l1;

            }

            if(l2!=null){

                node.next = l2;

            }

            return dummy.next;

        }

    }

  • 相关阅读:
    【转】Storm并行度详解
    Storm 集群安装配置
    【原】storm源码之storm代码结构【译】
    Storm中-Worker Executor Task的关系
    Storm源码分析--Nimbus-data
    storm配置
    Nimbus<三>Storm源码分析--Nimbus启动过程
    Nimbus<二>storm启动nimbus源码分析-nimbus.clj
    Twitter Storm源代码分析之Nimbus/Supervisor本地目录结构
    linux 相关学习记录
  • 原文地址:https://www.cnblogs.com/codeskiller/p/6359936.html
Copyright © 2020-2023  润新知