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;

        }

    }

  • 相关阅读:
    react学习总结(一)
    jQuery的attr()与prop()的区别
    Vue.js学习(常用指令)
    Node.js学习(篇章一)
    CSS3关于-webkit-tap-highlight-color属性
    position布局影响点击事件以及冒泡获取事件目标
    取消事件默认行为(移动端)
    rem与px之间的换算(移动端)
    Node.js(初识)
    ES6(变量的解构赋值)
  • 原文地址:https://www.cnblogs.com/codeskiller/p/6359936.html
Copyright © 2011-2022 走看看