算法与数据结构(合并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;
    }
};
相关推荐
多米Domi01120 小时前
0x3f第33天复习 (16;45-18:00)
数据结构·python·算法·leetcode·链表
罗湖老棍子21 小时前
【例4-11】最短网络(agrinet)(信息学奥赛一本通- P1350)
算法·图论·kruskal·prim
方圆工作室21 小时前
【C语言图形学】用*号绘制完美圆的三种算法详解与实现【AI】
c语言·开发语言·算法
曹仙逸21 小时前
数据结构day04
数据结构
Lips61121 小时前
2026.1.16力扣刷题
数据结构·算法·leetcode
曹仙逸1 天前
数据结构day05
数据结构
睡一觉就好了。1 天前
树的基本结构
数据结构
kylezhao20191 天前
C# 文件的输入与输出(I/O)详解
java·算法·c#
CodeByV1 天前
【算法题】堆
算法
kaikaile19951 天前
A星算法避开障碍物寻找最优路径(MATLAB实现)
数据结构·算法·matlab