LeetCode 23 - Merge k Sorted Lists

来源:互联网 发布:虚拟货币交易平台源码 编辑:程序博客网 时间:2024/06/05 19:02

LeetCode 23 - Merge k Sorted Lists

LeetCode 23 - Merge k Sorted Lists
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

我的解答

这是我在Divide and Conquer分类中找的一道题,因为一眼看去思路很明显,所以我就拿来练手了。

很显然,这应该算是归并排序相关的题目,合并k个排序完的序列。最trivial的方法,是第一个链表和第二个链表合并,结果和第三个链表合并,再和第四个链表和并……如果假设有k个链表,每个链表有m个元素,那么操作数应为2m+3m+4m+...+km=O(k2m)。而如果考虑用归并排序的做法,也就是分治思想去做,即先让相邻两个链表两两合并,结果中再两两合并……那么考虑每层操作都是km次,一共logk层,也就是说总共是O(kmlogk)了。

实现的时候,为了递归且减少不必要的内存开销,需要借助一个helper函数。

最后,这道hard题真水啊……

class Solution {public:    ListNode* mergeKLists_helper(vector<ListNode*>& lists,int index,int size)    {        if(size==0)        {            return NULL;        }        else if(size==1)        {            return lists[index];        }        else if(size==2)        {            auto i=lists[index],j=lists[index+1];            ListNode *head=NULL,*tail=NULL;            if(i==NULL&&j==NULL)            {            }            else if(i==NULL)            {                head=j;                tail=head;                j=NULL;            }            else if(j==NULL)            {                head=i;                tail=head;                i=NULL;            }            else            {                if(i->val<=j->val)                {                    head=new ListNode(i->val);                    tail=head;                    i=i->next;                }                else                {                    head=new ListNode(j->val);                    tail=head;                    j=j->next;                }            }            while(!(i==NULL && j==NULL))            {                if(i==NULL)                {                    tail->next=j;                    tail=tail->next;                    j=NULL;                }                else if(j==NULL)                {                    tail->next=i;                    tail=tail->next;                    i=NULL;                }                else                {                    if(i->val<=j->val)                    {                        tail->next=new ListNode(i->val);                        tail=tail->next;                        i=i->next;                    }                    else                    {                        tail->next=new ListNode(j->val);                        tail=tail->next;                        j=j->next;                    }                }            }            return head;        }        else        {            auto left=mergeKLists_helper(lists, index, size/2);            auto right=mergeKLists_helper(lists, index+size/2, size-size/2);            vector<ListNode*>re={left,right};            return mergeKLists_helper(re, 0, 2);        }    }    ListNode* mergeKLists(vector<ListNode*>& lists)    {        return mergeKLists_helper(lists, 0, lists.size());    }};



0 0
原创粉丝点击