zoukankan      html  css  js  c++  java
  • Leetcode-Merge k Sorted Lists

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

    Have you met this question in a real interview?
     
    Analysis:
    record the current head of each list. Use binary insertation to arrange the head list, select the minimum one and add to the end of the return list.
     
    Newest Solution (Use PriorityQueue):
    /**
     * 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;
            
            ListNode preHead = new ListNode(0);
            ListNode end = preHead;
            PriorityQueue<ListNode> queue = new PriorityQueue<ListNode>((a,b) -> (a.val-b.val));
            for (ListNode node : lists)
                if (node!=null){
                    queue.add(node);
                }
            
            while (!queue.isEmpty()){
                ListNode nextNode = queue.poll();
                end.next = nextNode;
                if (nextNode.next!=null){
                    queue.add(nextNode.next);
                }
                end = nextNode;
            }
            
            return preHead.next;
        }
    }
     
     
    Solution:
     1 /**
     2  * Definition for singly-linked list.
     3  * public class ListNode {
     4  *     int val;
     5  *     ListNode next;
     6  *     ListNode(int x) {
     7  *         val = x;
     8  *         next = null;
     9  *     }
    10  * }
    11  */
    12 public class Solution {
    13     public ListNode mergeKLists(List<ListNode> lists) {
    14         //Consider the cases where the element in lists is NULL!
    15         for (int i=0;i<lists.size();i++)
    16             if (lists.get(i)==null){
    17                 lists.remove(i);
    18                 i--;
    19             }
    20         if (lists.size()==0) return null;
    21         if (lists.size()==1) return lists.get(0);
    22 
    23         ListNode preHead = new ListNode(0);
    24         ListNode end = preHead;
    25         List<ListNode> curList = new ArrayList<ListNode>();
    26         curList.add(lists.get(0));
    27         for (int i=1;i<lists.size();i++) binaryInsert(curList,lists.get(i));
    28         while (curList.size()!=0){
    29             if (curList.size()==1){
    30                 end.next = curList.get(0);
    31                 end = new ListNode(0);
    32                 break;
    33             }
    34             ListNode target = curList.get(0);            
    35             curList.remove(0);
    36             if (target.next!=null) binaryInsert(curList,target.next);
    37             end.next = target;
    38             end = target;
    39         }
    40         end.next = null;
    41         return preHead.next;
    42         
    43     }
    44 
    45     public void binaryInsert(List<ListNode> lists, ListNode node){
    46         int start = 0;
    47         int end = lists.size()-1;
    48         int index = -1;
    49         while (start<end){
    50             int mid = (start+end)/2;
    51             if (node.val == lists.get(mid).val){
    52                 index = mid;
    53                 break;
    54             }
    55 
    56             if (node.val>lists.get(mid).val){
    57                 start = mid+1;
    58                 continue;
    59             }
    60 
    61             if (node.val<lists.get(mid).val){
    62                 end = mid-1;
    63                 continue;
    64             }
    65         }
    66         
    67         //NOTE: There are two ending cases, we need consider them carefully!.
    68         if (index==-1){
    69             if (start==end)
    70                 if (node.val>lists.get(start).val) index=start+1;
    71                 else index = start;
    72             else index = start;   //i.e., start>end.
    73         }  
    74 
    75         lists.add(index,node);
    76 
    77         return;
    78     }        
    79 }
  • 相关阅读:
    LINUX中常用操作命令
    NET Core Kestrel部署HTTPS
    Java中Enum枚举的使用
    Java多线程——sychronized
    Java中SynchronizedMap与ConcurrentHashMap的对比
    Java中HashMap实现原理
    数据结构——Java实现单向链表
    数据库——事务基础
    数据结构——Java实现二叉树
    Java中ThreadLocal的深入理解
  • 原文地址:https://www.cnblogs.com/lishiblog/p/4114641.html
Copyright © 2011-2022 走看看