• 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;
        }
  • 相关阅读:
    COM学习(三)——数据类型
    com学习(一)GUID 和 接口
    Dll学习(二)__declspec用法详解
    dll 学习(一)
    PostMessage与SendMessage的区别(二)
    sendmessage和postmessage的区别
    用Java开发代理服务器
    JAVA编写WEB服务器
    【1.3】Django HelloWorld
    【1.2】初识Django应用
  • 原文地址:https://www.cnblogs.com/renyualbert/p/5867295.html
Copyright © 2020-2023  润新知