【LeetCode23】-合并K个升序链表

方法一(暴力求解)

实现思路

依次合并两个相连的链表

时间复杂度

在这里插入图片描述

方法二(利用STL)

实现思路

在这里插入图片描述

实现代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
 bool cmp(const ListNode *n1,const ListNode *n2){
    
    
     return (n1->val)<(n2->val);
 }
class Solution {
    
    
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
    
    
        if(lists.size()==0) return nullptr;
        vector<ListNode*> all;
        for(int i=0;i<lists.size();i++){
    
    
            ListNode *head=lists[i];
            while(head!=nullptr){
    
    
                all.push_back(head);
                head=head->next;
            }
        }
        if(all.size()==0) return nullptr;

        sort(all.begin(),all.end(),cmp);
        for(int i=0;i<all.size()-1;i++){
    
    
            all[i]->next=all[i+1];
        }
        all[all.size()-1]->next=nullptr;
        return all[0];
    }
};

提交结果及分析

在这里插入图片描述

由于logkN是小于k的,所以kNlogkN肯定是比k^2N要小的

方法三(分治策略)

实现思路

在这里插入图片描述

实现代码

在这里插入图片描述