LeetCode刷题笔记 23. 合并K个排序链表

23. 合并K个排序链表

题目要求

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

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

题解

https://github.com/soulmachine/leetcode

直接复用mergeTwoLists。

class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        if(lists.size()==0) return nullptr;
        ListNode *p=lists[0];
        for(int i=1;i<lists.size();i++){
            p=mergeTwoLists(p,lists[i]);
        }
        return p;        
    }
    ListNode* mergeTwoLists(ListNode *l1,ListNode *l2){
        ListNode head(-1);
        for(ListNode* p=&head;l1!=nullptr||l2!=nullptr;p=p->next){
            int val1=l1==nullptr?INT_MAX:l1->val;
            int val2=l2==nullptr?INT_MAX:l2->val;
            if(val1<=val2){
                p->next=l1;
                l1=l1->next;
            }
            else{
                p->next=l2;
                l2=l2->next;
            }            
        }
        return head.next;
    }
};
执行用时 内存消耗
320 ms 10.8 MB

纯递归法

class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        if(lists.size()==0) return nullptr;
        ListNode *p=lists[0];
        for(int i=1;i<lists.size();i++){
            p=mergeTwoLists(p,lists[i]);
        }
        return p;        
    }
    ListNode* mergeTwoLists(ListNode *l1,ListNode *l2){
        if(l1==nullptr)
            return l2;
        if(l2==nullptr)
            return l1;
        if(l1->val<l2->val){
            l1->next=mergeTwoLists(l1->next,l2);
            return l1;
        }else{
            l2->next=mergeTwoLists(l2->next,l1);
            return l2;
        }
    }
};
执行用时 内存消耗
300 ms 11.4 MB
发布了18 篇原创文章 · 获赞 0 · 访问量 1807

猜你喜欢

转载自blog.csdn.net/g534441921/article/details/104127613