算法与数据结构(合并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;
    }
};
相关推荐
小林熬夜学编程11 分钟前
【MySQL】第一弹---MySQL 在 Centos 7环境安装
linux·开发语言·数据库·mysql·算法
魂兮-龙游29 分钟前
C语言:将四个八位无符号数据拼接成32位的float数据
c语言·开发语言·算法·数据分析
self-discipline3621 小时前
2025.2.5总结
数据结构·算法
银河梦想家2 小时前
【Day31 LeetCode】动态规划DP Ⅳ
算法·leetcode·动态规划
go54631584652 小时前
复现论文“去模糊算法”
算法
Mr.Demo.2 小时前
[Collection与数据结构] B树与B+树
数据结构·b树
进击的_鹏3 小时前
string类OJ练习题
开发语言·c++·算法
余辉zmh3 小时前
【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(四)
数据结构·算法·leetcode·贪心算法
Evand J11 小时前
课题推荐——基于自适应滤波技术的多传感器融合在无人机组合导航中的应用研究
开发语言·算法·matlab·无人机