算法与数据结构(合并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;
    }
};
相关推荐
冲帕Chompa1 小时前
图论part10 bellman_ford算法
数据结构·算法·图论
緈福的街口1 小时前
【leetcode】144. 二叉树的前序遍历
算法·leetcode
GG不是gg1 小时前
排序算法之基础排序:冒泡,选择,插入排序详解
数据结构·算法·青少年编程·排序算法
随意起个昵称2 小时前
【双指针】供暖器
算法
倒霉蛋小马2 小时前
最小二乘法拟合直线,用线性回归法、梯度下降法实现
算法·最小二乘法·直线
codists2 小时前
《算法导论(第4版)》阅读笔记:p82-p82
算法
埃菲尔铁塔_CV算法2 小时前
深度学习驱动下的目标检测技术:原理、算法与应用创新
深度学习·算法·目标检测
float_com3 小时前
【背包dp-----分组背包】------(标准的分组背包【可以不装满的 最大价值】)
算法·动态规划
丶Darling.3 小时前
Day119 | 灵神 | 二叉树 | 二叉树的最近共公共祖先
数据结构·c++·算法·二叉树
L_cl4 小时前
【Python 算法零基础 3.递推】
算法