• LeetCode


    题目:

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

    思路:

    1)直接利用Merge two sorted lists的代码,但超时了。原因是这个时间复杂度太大,2n + 3n + 4n +..+ kn = O(nk^2)

    package list;
    
    public class MergeKSortedLists {
    
        public ListNode mergeKLists(ListNode[] lists) {
            int len;
            if (lists == null || (len = lists.length) == 0) return null;
            ListNode q = lists[0];
            for (int i = 1; i < len; ++i) {
                q= mergeTwoLists(q, lists[i]);
            }
            
            return q;
        }
        
        public ListNode mergeTwoLists(ListNode l1, ListNode l2) {        
            ListNode p = new ListNode(0);
            p.next = null;
            ListNode head = p;
            
            while (l1 != null && l2 != null) {
                if (l1.val < l2.val) {
                    p.next = l1;
                    l1 = l1.next;
                } else {
                    p.next = l2;
                    l2 = l2.next;
                }
                p = p.next;
            }
            
            p.next = l1 == null ? l2 : l1;
            return head.next;
        }
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
        }
    
    }

    2)运用merge sort的思想,两两合并。时间复杂度是2n*k/2 + 4n*k/4 + .. + (2^x)n*k/(2^x) = xkn,其中x为logk

    package list;
    
    public class MergeKSortedLists {
    
        public ListNode mergeKLists(ListNode[] lists) {
            int len;
            if (lists == null || (len = lists.length) == 0) return null;
            
            int cur = 0;
            int end = len - 1;
            while (end > 0) {
                cur = 0;
                while (cur < end) {
                    lists[cur] = mergeTwoLists(lists[cur], lists[end]);
                    ++cur;
                    --end;
                }
            }
                        
            return lists[0];
        }
        
        public ListNode mergeTwoLists(ListNode l1, ListNode l2) {        
            ListNode p = new ListNode(0);
            p.next = null;
            ListNode head = p;
            
            while (l1 != null && l2 != null) {
                if (l1.val < l2.val) {
                    p.next = l1;
                    l1 = l1.next;
                } else {
                    p.next = l2;
                    l2 = l2.next;
                }
                p = p.next;
            }
            
            p.next = l1 == null ? l2 : l1;
            return head.next;
        }
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
        }
    
    }
  • 相关阅读:
    Linux 防火墙配置
    【存在问题,待修改】SSH 远程登陆
    Hadoop 本地模式安装
    CentOS7 安装 JDK
    JS的DOM操作
    JavaScript
    格式与布局(定位)
    样式表
    表单、内嵌网页
    HTML中的一般标签、常用标签和表格
  • 原文地址:https://www.cnblogs.com/null00/p/5060690.html
Copyright © 2020-2023  润新知