腾讯精选50题(4)

23.合并K个排序链表
https://leetcode-cn.com/problems/merge-k-sorted-lists/
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:

输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6

1.暴力法:

class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        vector<int> res;
        int len = lists.size();
        for(int i=0;i<len;i++){
            ListNode* cur=lists[i];
            while(cur!=NULL){
                res.push_back(cur->val);
                cur = cur->next;
            }
        }
        sort(res.begin(),res.end());
        ListNode* point=new ListNode(0);
        ListNode* head=point;
        for(int i=0;i<res.size();i++){
            point->next=new ListNode(res[i]);
            point = point->next;
        }
        return head->next;
    }
};

2.分治法
在这里插入图片描述

class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        int len=lists.size();
        if(len==0) return NULL;
        int step=1;
        while(step<len){
            for(int i=0;i<len-step;i=i+step*2){
                lists[i] = merge(lists[i],lists[i+step]);
            }
            step=step*2;
        }
        return lists[0];
    }
    ListNode* merge(ListNode* l1,ListNode* l2){
        ListNode* point=new ListNode(0);
        ListNode* head=point;
        while(l1&&l2){
            if(l1->val<=l2->val){
                point->next=l1;
                l1=l1->next;
            }
            else{
                point->next=l2;
                l2=l2->next;
            }
            point = point->next;
        }
        if(l1) point->next=l1;
        if(l2) point->next=l2;
        return head->next;
    }
};
发布了48 篇原创文章 · 获赞 0 · 访问量 1876

猜你喜欢

转载自blog.csdn.net/weixin_43527195/article/details/98753905