zoukankan      html  css  js  c++  java
  • 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;

        }

    }

  • 相关阅读:
    docker下overlay2占用空间过大,清理docker占用空间
    js为浏览器URL追加参数
    img转Blob对象
    《ECharts》伪立体柱状图
    js分秒格式转时分秒
    表单边框缺一角效果
    File对象转base64
    《VUE》可编辑div限制字数
    quill富文本编辑器自定义字体、文字大小(编辑器内含element上传组件)
    我在华为工作十年的感悟(文摘)
  • 原文地址:https://www.cnblogs.com/codeskiller/p/6359936.html
Copyright © 2011-2022 走看看