leetcode 23. 合并 K 个升序链表

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

复制代码
输入: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

首先我们想到的是归并排序,对链表数组不断进行分割然后合并分割的链表
cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    //分左右递归不断分割链表
    ListNode* apart_list(int l,int r,vector<ListNode*>& lists)//区间是前闭后开
    {     
        //这道题并不会l>=r,但是如果传参失误则需要终止递归 看似多余实则不多余
        if(l>=r) return nullptr;
        if(r-l==1) return lists[l]; //表示当前区间只有一个元素lists[l] 有序直接返回即可
        int mid=(l+r)/2;            //确定中间值
        
        //返回排序后的左右分割链表
        return merge(apart_list(l,mid,lists),apart_list(mid,r,lists));
    }

    //合并lists[h]和lists[h1]链表
    ListNode* merge(ListNode* h,ListNode* h1)
    {
        ListNode* temp=new ListNode(0);
        ListNode* l1=h;
        ListNode* l2=h1;
        ListNode* cur=temp;
        while(l1!=nullptr&&l2!=nullptr)
        {
            if(l1->val>=l2->val)
            {
                cur->next=l2;
                cur=cur->next;
                l2=l2->next;
            }
            else
            {
                cur->next=l1;
                cur=cur->next;
                l1=l1->next;
            }
        }
        cur->next=(l1==nullptr)? l2:l1;  
        Listnode* result=temp->next;
        delete temp;   //释放内存    
        return result;
    }

    ListNode* mergeKLists(vector<ListNode*>& lists) 
    { 
        int n=lists.size();
        if(n==0) return nullptr;       //链表数组为空返回nullptr
        if(n==1) return lists[0];      //链表数组为1直接返回lists[0]即可
        return apart_list(0,n,lists);  //返回分割的链表
    }
};
复制代码
相关推荐
九圣残炎20 分钟前
【从零开始的LeetCode-算法】3227. 字符串元音游戏
java·算法·leetcode
悄悄敲敲敲28 分钟前
Linux:基础开发工具
linux·运维·服务器
Industio_触觉智能39 分钟前
瑞芯微方案主板Linux修改系统串口波特率教程,触觉智能RK3562开发板演示
linux·开发板·串口调试·rk3562·波特率
橘子真甜~1 小时前
Linux操作系统3-文件与IO操作1(从C语言IO操作到系统调用)
linux·运维·服务器·c语言·io·文件操作·文件fd
A charmer1 小时前
Linux 权限管理:用户分类、权限解读与常见问题剖析
linux·运维·服务器
羊村懒哥1 小时前
linux-安全-iptables防火墙基础笔记
linux·网络·安全
孙同学_1 小时前
【Linux篇】权限管理 - 用户与组权限详解
java·linux·服务器
猫猫的小茶馆2 小时前
【Linux系统】Linux内核框架(详细版本)
linux·运维·服务器·开发语言·嵌入式软件
风行無痕2 小时前
Ubuntu 22.04 解决EasyExcel导出报错和读写问题 缺失字体
linux·运维·ubuntu
运维小文2 小时前
Ubuntu修改kube-proxy的工作模式为ipvs
linux·运维·ubuntu·k8s·ipvs·kube-proxy