zoukankan      html  css  js  c++  java
  • [leetcode 23]Merge k Sorted Lists

    1 题目

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

    2 思路

    当时看到这个题目就想到的是归并排序。好吧,但是,具体代码写不出来。题目给的是数组:public ListNode mergeKLists(ListNode[] lists),我就想,怎么归并排序,然后返回一个已经排好的,再进行递归。想破脑袋没想出来。

    原来,可以赋值给一个ArrayList,然后,List还有一个牛逼的方法:lists.subLists(int i,int j)方法,前面的是包括,后面的是不包括,天然的用于分治策略啊。

    看的别人代码链接:

    https://leetcode.com/discuss/10012/a-solution-use-divide-and-conquer-algorithm-in-java

    https://leetcode.com/discuss/9279/a-java-solution-based-on-priority-queue

    3 代码:

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    public class Solution {
        private ListNode mergeTwoLists(ListNode l1, ListNode l2) 
        {
            if(l1 == null){
                return l2;
            }
            if(l2 == null){
                return l1;
            }
            ListNode head = new ListNode(0);
            ListNode node = head;
            
            ListNode list1 = l1;
            ListNode list2 = l2;
        
            while(list1 != null && list2 != null){
                if(list1.val > list2.val){
                    node.next = list2;
                    list2 = list2.next;
                }else{
                    node.next = list1;
                    list1 = list1.next;
                }
                node = node.next;
            }
            
            /* connect the longer list */
            if(list1 != null){
                node.next = list1;
            }
            if(list2 != null){
                node.next = list2;
            }
            
            return head.next;
        }
    
        public ListNode mergeKLists(List<ListNode> lists) {
            if(lists.size()==0) return null;
            if(lists.size()==1) return lists.get(0);
            if(lists.size()==2) return mergeTwoLists(lists.get(0),lists.get(1));
            
            ListNode node1 = mergeKLists(lists.subList(0,lists.size()/2));
            ListNode node2 = mergeKLists(lists.subList(lists.size()/2,lists.size()));
            
            return mergeTwoLists(node1,node2);
        }
        
        public ListNode mergeKLists(ListNode[] lists){
            List<ListNode> list = new ArrayList<>();
            for(ListNode node : lists){
                list.add(node);
            }
            return mergeKLists(list);
        }
        
    }

    看别人的代码,发现还有一个更简洁的递归写法:

    return mergeTwoLists(mergeKLists(lists.subList(0, lists.size()/2)), mergeKLists(lists.subList(lists.size()/2, lists.size())));

    感觉像是  调用一个递归,然后参数还是递归。屌爆了,希望将来能培养出这种思路和写法来。

     
  • 相关阅读:
    NanoHTTPD服务
    Pattern、Matcher的用法
    浅析protobuf应用
    Socket通信,基本方法介绍
    String常用处理方法
    什么是重做日志?
    控制文件数据字典视图
    删除控制文件
    使用当前副本恢复控制文件
    备份控制文件
  • 原文地址:https://www.cnblogs.com/lingtingvfengsheng/p/4808357.html
Copyright © 2011-2022 走看看