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.

    最简单的思路是利用之前Merge 2 sorted Lists, 逐个相加,但是这种的时间复杂度会更高。

    public ListNode MergeKLists(ListNode[] lists) {
            ListNode sentinel = null;
            for(int i = 0;i<lists.Count();i++)
            {
                sentinel = MergeTwoLists(sentinel,lists[i]);
            }
            return sentinel;
        }
        
        public ListNode MergeTwoLists(ListNode l1, ListNode l2) {
           if(l1 == null) return l2;
           if(l2 == null) return l1;
           var w1 = l1;
           var w2 = l2;
           var sentinel = new ListNode(-1);
           var dummy = sentinel;
           while(l1 != null && l2 != null)
           {
               if(l1.val >= l2.val) 
               {
                   sentinel.next = new ListNode(l2.val);
                   sentinel = sentinel.next;
                   l2 = l2.next;
               }
               else
               {
                   sentinel.next = new ListNode(l1.val);
                   sentinel = sentinel.next;
                   l1 = l1.next;
               }
           }
           if(l1 == null)
           sentinel.next = l2;
           else
           sentinel.next = l1;
           return dummy.next;
        }

    下面用跟merge sort一样的思路,merge 为k/2的linked list array, 然后merge

    public ListNode MergeKLists(ListNode[] lists) {
            var size = lists.Count();
            if(size==0) return null;
            if(size==1) return lists[0];
            while(size>1)
            {
                int k = (size+1)/2;
                for(int i =0;i<size/2;i++)
                {
                    lists[i] = MergeTwoLists(lists[i], lists[i+k]);
                }
                size = k;
            }
            return lists[0];
        }
        
        public ListNode MergeTwoLists(ListNode l1, ListNode l2) {
           if(l1 == null) return l2;
           if(l2 == null) return l1;
           var w1 = l1;
           var w2 = l2;
           var sentinel = new ListNode(-1);
           var dummy = sentinel;
           while(l1 != null && l2 != null)
           {
               if(l1.val >= l2.val) 
               {
                   sentinel.next = new ListNode(l2.val);
                   sentinel = sentinel.next;
                   l2 = l2.next;
               }
               else
               {
                   sentinel.next = new ListNode(l1.val);
                   sentinel = sentinel.next;
                   l1 = l1.next;
               }
           }
           if(l1 == null)
           sentinel.next = l2;
           else
           sentinel.next = l1;
           return dummy.next;
        }
  • 相关阅读:
    unity编辑器扩展
    unity给localRotation赋值
    ASp.net常用服务
    二叉树
    Photon Server类函数介绍
    线程间操作无效: 从不是创建控件的线程访问它的三种方法
    使用vs的输出窗口进行调试输出数据
    Bmob后端云之云数据库的使用
    软件设计的七大原则
    Unite Beijing 2018 参会简要分享
  • 原文地址:https://www.cnblogs.com/renyualbert/p/5867295.html
Copyright © 2011-2022 走看看