34 合并K个升序链表

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例 1:

复制代码
输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
  1->4->5,
  1->3->4,
  2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6

示例 2:

复制代码
输入:lists = []
输出:[]

示例 3:

复制代码
输入:lists = [[]]
输出:[]

提示:

  • k == lists.length
  • 0 <= k <= 10^4
  • 0 <= lists[i].length <= 500
  • -10^4 <= lists[i][j] <= 10^4
  • lists[i] 按 升序 排列
  • lists[i].length 的总和不超过 10^4

思路

先合并两个升序链表为一个升序链表,然后再用合并后的链表合并第三个升序链表,依次类推。

总的算法是:合并两个有序链表

cpp 复制代码
class Solution {
public:
    //合并两个升序的链表
ListNode* merge(ListNode* head1, ListNode* head2) {
    if(!head1) return head2;
    if(!head2) return head1;
    ListNode prehead(0);
    ListNode* pMove=&prehead;

    while(head2&&head1){
        if(head1->val<=head2->val){
            pMove->next=head1;
            head1=head1->next;
        }
        else{
            pMove->next=head2;
            head2=head2->next;
        }

        pMove=pMove->next;
    }

    if(head2)
        pMove->next=head2;
    if(head1)
        pMove->next=head1;

    return (&prehead)->next;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
     int size=lists.size();
    if(0==size) return nullptr;
    if(1==size) return lists[0];
    ListNode* list=nullptr;
    for(int i=0;i<size;i++){
        list=merge(list,lists[i]);
    }
    return list;
}
};

推荐一个零声教育学习教程,个人觉得老师讲得不错,分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,点击立即学习:链接

相关推荐
微尘hjx26 分钟前
【ByteTrack 04】多轨迹算法ByteTrack改进点
算法·yolo·目标检测·目标跟踪·bytetrack·ultralytics·车跟踪
米米商聊3 小时前
同名附件为什么被 Map 覆盖?重复键与一对多索引
前端·javascript
小蒋观天下4 小时前
雷击与浪涌防护:前端SPD选型、接地网误区,接地不当反而引入干扰
深度学习·算法·机器学习
WBluuue6 小时前
数据结构与算法:分块(一):块状数组、块状链表
数据结构·c++·算法·链表
kyriewen6 小时前
我把 10 道面试题答案真跑了一遍:6 道是错的
前端·javascript·面试
WebInfra7 小时前
Rspack 2.3 发布:联手 SWC 团队带来全新编译器
前端·javascript·github
澳鹏Appen7 小时前
澳鹏重磅发布ExamOCRBench:面向端到端试卷判分的多任务基准
算法·benchmark·基准评测
benjormin7 小时前
Java数据结构 二叉搜索树
数据结构·算法
人工智能培训7 小时前
知识图谱:结构化表达实体与关系的知识组织技术
大数据·人工智能·算法·重构·生活·知识图谱