AcWing
  • 首页
  • 题库
  • 题解
  • 分享
  • 问答
  • 活动
  • 应用
  • 吐槽
  • 登录/注册

LeetCode 23. 合并K个排序链表

作者: 作者的头像   tea321000 ,  2021-01-07 20:11:34 ,  阅读 10


0


class Solution {
    #ifdef _commet
    k路归并两种做法,一种是转化成两路归并,一种是用小顶堆来做,两种都是O(nlogk)
    #endif
public:
    #ifdef _heap
    struct heapCmp{
        bool operator() (ListNode* a,ListNode *b)
        {
            return a->val > b->val; 
        } 
    };
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        priority_queue<ListNode *,vector<ListNode *>, heapCmp> heap;
        auto ans = new ListNode(-1),tail = ans;
        for(auto l:lists)
            if(l)
                heap.push(l);
        while(!heap.empty())
        {
            auto tmp = heap.top();
            heap.pop();
            tail = tail->next = tmp;
            if(tail->next)//注意要判断next是否为空 否则会runtime error
                heap.push(tail->next);
        }
        return ans->next;
    }
    #endif
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2)//注意函数形参为ListNode*而不是vector<ListNode*>
    {
        auto ans=new ListNode(-1),tail=ans;
        while(l1!=NULL && l2!=NULL)
        {
            if(l1->val > l2->val)
            {
                tail = tail->next = l2;
                l2 = l2->next;
            }
            else
            {
                tail = tail->next = l1;
                l1 = l1->next;
            }
        }
        tail->next=l1!=NULL?l1:l2;
        return ans->next;
    }

    ListNode* mergeKLists(vector<ListNode*>& lists) {
        if (lists.size() == 0)
            return NULL;
        if (lists.size() == 1)
            return lists[0];

        int mid= lists.size()/2;
        vector<ListNode*> k_left = vector<ListNode*>(lists.begin(),lists.begin()+mid);
        vector<ListNode*> k_right =vector<ListNode*>(lists.begin()+mid, lists.end());
        ListNode* l = mergeKLists(k_left);//通过递归函数本身将vector<ListNode *>转化成ListNode*求两路归并
        ListNode * r = mergeKLists(k_right);
        return mergeTwoLists(l,r);
    }

};

0 评论

你确定删除吗?

© 2018-2021 AcWing 版权所有  |  京ICP备17053197号-1
联系我们  |  常见问题
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息