LeetCode 23 - Merge k Sorted Lists

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值