ITPub博客

首页 > > > [LeetCode] Merge k Sorted Lists

[LeetCode] Merge k Sorted Lists

作者:Ruiyuan Li 时间:2015-04-22 00:00:00 0 删除 编辑

Merge k Sorted Lists

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

解题思路:

1、分治方法,两两合并。设每个链表的长度为n,有k个链表,那么每次合并最多扫描所有的元素,共扫描k/2+k/4+...+1=k次,因此时间复杂度为O(nk*k)=O(nk^2)。代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* mergeKLists(vector& lists) {
        int len=lists.size();
        if(len==0){
            return NULL;
        }
        if(len==1){
            return lists[0];
        }
        vector tempLists;
        for(int i=0; ival>list2->val){
                rear->next=list2;
                list2=list2->next;
            }else{
                rear->next=list1;
                list1=list1->next;
            }
            rear=rear->next;
        }
        if(list1!=NULL){
            rear->next=list1;
        }
        if(list2!=NULL){
            rear->next=list2;
        }
        rear=head;
        head=head->next;
        delete rear;
        return head;
    }
};

2、可以用一个最小堆来存储每个链表的头结点,每次将最小元素出列,并维护最小堆。建堆的时间复杂度为O(k*lgk),对于每个链表元素,执行shiftdown的时间复杂度最大为O(lgk),共有nk个链表元素,因此算法的总时间复杂度为O(nlgk+nklgk)=O(nklgk)。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* mergeKLists(vector& lists) {
        int len=lists.size();
        if(len==0){
            return NULL;
        }
        ListNode* head=new ListNode(0), *rear=head;
        
        ListNode* minHeap[len]; //用一个最小堆来记录
        int minHeadLength=0;  //最小堆的有效长度
        
        for(int i=0; i0){
            rear->next=minHeap[0];
            rear=rear->next;
            minHeap[0]=minHeap[0]->next;
            if(minHeap[0]==NULL){
                minHeap[0]=minHeap[minHeadLength-1];
                minHeadLength--;
            }
            shiftDown(minHeap, minHeadLength, 0);
        }
        
        rear=head;
        head=head->next;
        delete rear;
        return head;
    }
    
    void buildMinHeap(ListNode** minHeap, int len){
        for(int i=(len-2)/2; i>=0; i--){
            shiftDown(minHeap, len, i);
        }
    }
    
    void shiftDown(ListNode** minHeap, int len, int index){
        int target=2*index+1;
        if(target>=len){
            return;
        }
        if(target+1valval){
            target = target+1;
        }
        if(minHeap[index]->val>minHeap[target]->val){
            swap(minHeap, index, target);
            shiftDown(minHeap, len, target);
        }
    }
    
    void swap(ListNode** minHeap, int i, int j){
        ListNode* tempNode=minHeap[i];
        minHeap[i]=minHeap[j];
        minHeap[j]=tempNode;
    }
};


转载请注明: » [LeetCode] Merge k Sorted Lists
<!-- -->

原文作者:;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2020-05-21

  • 博文量
    495
  • 访问量
    4826