Merge k Sorted Lists

是分治思想。设k为链表个数,每个链表含有n个元素。则有T(k)=2T(k/2)+nk;由递归树可以求出时间复杂度为O(nklogk)。代码如下:

 ListNode *mergetwo(ListNode *l1, ListNode *l2) 
 {
       
        if(l1==NULL)return l2;
        if(l2==NULL)return l1;
        ListNode* node1=l1;
        ListNode* node2=l2;
        ListNode* cur=NULL;
        ListNode* result=NULL;
        while(node1&&node2)
        {
            if(result==NULL)
            {
                if(node1->val<node2->val)
                {
                    result=cur=node1;
                    node1=node1->next;
                    cur->next=NULL;
                }
                else
                {
                    result=cur=node2;
                    
                    node2=node2->next;
                    cur->next=NULL;
                    
                }
            }
            else
            {
                if(node1->val<node2->val)
                {
                    cur->next=node1;
                    cur=cur->next;
                    
                    node1=node1->next;
                    cur->next=NULL;
                }
                else
                {
                    cur->next=node2;
                    cur=cur->next;
                   
                    node2=node2->next;
                     cur->next=NULL;
                    
                }
            }
        }
        if(node1) cur->next=node1;
        else cur->next=node2;
        return result;
        
    }

    ListNode* mergeKLists(vector<ListNode*>& lists) {
        if(lists.size()<1)return NULL;
        if(lists.size()==1)return lists[0];
        int j=lists.size();
        int n=(j+1)/2;
        vector<ListNode*> node1(lists.begin(),lists.begin()+n);
        vector<ListNode*> node2(lists.begin()+n,lists.end());
        ListNode* l1 = mergeKLists(node1) ;  
        ListNode* l2 = mergeKLists(node2) ; 
       
        return mergetwo(l1,l2);
    }

 

posted on 2016-04-13 16:46  Seven_noon  阅读(139)  评论(0编辑  收藏  举报