算法与数据结构(合并K个升序链表)

思路

有了合并两个链表的基础后,这个的一种方法就是可以进行顺序合并,我们可以先写一个函数用来合并两个链表,再在合并K个链表的的函数中循环调用它。

解题过程

解析这个函数

首先,可以先判断,如果a为空,则返回b。如果b为空,则返回a。

在合并链表时,我们需要一个head保存合并之后链表的头,我们可以把head设为一个虚拟的头(不保存val)。

其次,我们还需要一个指针(cur)记录下一个插入位置的前一个位置。

我们还需要设置pa,pb指针来对a,b链表进行遍历

当pa和pb都非空时:

若pa->val < pb->val,则将pa插入到cur的后面,pa向后移动一个。

若pa->val >= pb->val,则将pb插入到cur的后面,pb向后移动一个。

两个插入完之后,cur都需要向后移动一个,方便下次插入。

循环结束之后,运用三元运算符,若pa不为空,则cur直接接上pa剩下的。反之,接上pb。合并完链表后,返回head.next

遍历lists:

将空链表不断与list中的数据进行合并

最后返回ans。

代码

cpp 复制代码
//顺序合并
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* a, ListNode* b)
    {
        if(!a)
        return b;
        if(!b)
        return a;
        ListNode head, *cur = &head, *pa = a, *pb = b;
        while(pa && pb)
        {
            if(pa->val < pb->val)
            {
                cur->next = pa;
                pa = pa->next;
            }
            else
            {
                cur->next = pb;
                pb = pb->next;
            }
            cur = cur->next;
        }
        cur->next = (pa ? pa : pb);
        return head.next;
    }
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        ListNode* ans = nullptr;
        for(int i = 0; i < lists.size();i++)
        {
           ans = mergeTwoLists(ans, lists[i]);
        }
        return ans;
    }
};
相关推荐
仰泳的熊猫6 分钟前
1112 Stucked Keyboard
数据结构·c++·算法·pat考试
roman_日积跬步-终至千里10 分钟前
【计算机算法与设计(14)】例题五:最小生成树:Prim算法详细解释:π的含义、更新逻辑和选点原因
算法
让学习成为一种生活方式11 分钟前
压缩文件夹下下所有文件成压缩包tar.gz--随笔016
算法
嗷嗷哦润橘_17 分钟前
AI Agent学习:MetaGPT项目之RAG
人工智能·python·学习·算法·deepseek
不忘不弃35 分钟前
指针元素的使用
算法
he___H37 分钟前
滑动窗口一题
java·数据结构·算法·滑动窗口
AI科技星38 分钟前
统一场论质量定义方程:数学验证与应用分析
开发语言·数据结构·经验分享·线性代数·算法
ULTRA??40 分钟前
KD-Tree的查询原理
python·算法
学编程就要猛1 小时前
数据结构初阶:Map和Set接口
数据结构
jianfeng_zhu1 小时前
不带头节点的链式存储实现链栈
数据结构·算法