合并K个升序链表

题目
解法一

优先级队列

思想

将每个链表中的一个节点存放到优先级队列中,本题采用小根堆,将小根堆中的根节点取出,插入到最终的链表中,并且将该节点在原链表中的下一个节点插入小根堆中(需要向下调整),直到堆中没有节点为止(即所以链表都已经合并完)。

代码
cpp 复制代码
class Solution {
public:
    struct Less{
        bool operator()(ListNode* l1,ListNode* l2){
            return l1->val > l2->val;
        }
    };

    ListNode* mergeKLists(vector<ListNode*>& lists) {
        ListNode* node=new ListNode(0);
        ListNode* cur=node;
        priority_queue<ListNode*,vector<ListNode*>,Less> q;
        for(auto& it:lists){
            if(it) q.push(it);
        }
        while(!q.empty()){
            ListNode* tmp=q.top();
            q.pop();
            cur->next=tmp;
            if(tmp->next) q.push(tmp->next);
            cur=cur->next;
        }
        return node->next;
    }
};
解法二

归并/分治

思想

将链表两两进行合并,直到合并为一个链表为止。

代码
cpp 复制代码
class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        return mergeL(lists,0,lists.size()-1);
    }

    ListNode* mergeL(vector<ListNode*>& lists,int l,int r){
        if(l>r) return nullptr;
        if(l==r) return lists[l];
        int mid=(l+r)>>1;
        ListNode* l1=mergeL(lists,l,mid);
        ListNode* l2=mergeL(lists,mid+1,r);
        return merge2L(l1,l2);
    }

    ListNode* merge2L(ListNode* l1,ListNode* l2){
        if(l1==nullptr) return l2;
        if(l2==nullptr) return l1;
        if(l1->val < l2->val){
            l1->next=merge2L(l1->next,l2);
            return l1;
        }
        else{
            l2->next=merge2L(l1,l2->next);
            return l2;
        }
    }
};
相关推荐
智者知已应修善业4 小时前
【求中位数】2024-1-23
c语言·c++·经验分享·笔记·算法
地平线开发者5 小时前
PTQ 量化数值范围与优化
算法·自动驾驶
sali-tec5 小时前
C# 基于halcon的视觉工作流-章68 深度学习-对象检测
开发语言·算法·计算机视觉·重构·c#
测试人社区-小明5 小时前
智能弹性伸缩算法在测试环境中的实践与验证
人工智能·测试工具·算法·机器学习·金融·机器人·量子计算
罗西的思考6 小时前
【Agent】MemOS 源码笔记---(5)---记忆分类
人工智能·深度学习·算法
qq_433554549 小时前
C++数位DP
c++·算法·图论
AshinGau9 小时前
Softmax 与 交叉熵损失
神经网络·算法
似水এ᭄往昔9 小时前
【C++】--AVL树的认识和实现
开发语言·数据结构·c++·算法·stl
栀秋6669 小时前
“无重复字符的最长子串”:从O(n²)哈希优化到滑动窗口封神,再到DP降维打击!
前端·javascript·算法
xhxxx9 小时前
不用 Set,只用两个布尔值:如何用标志位将矩阵置零的空间复杂度压到 O(1)
javascript·算法·面试