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);  //返回分割的链表
    }
};
复制代码
相关推荐
CHANG_THE_WORLD40 分钟前
12.总结:深入理解 Linux I/O 多路复用:select、poll、epoll 全解析
linux·运维·服务器
风曦Kisaki1 小时前
# Linux笔记:操作系统优化与资源管理
linux·运维·服务器·笔记
Mr.HeBoYan2 小时前
一次持续三天才出现的丢包故障——深入解析 DPDK Memory Ordering、rte_ring 与 CPU Memory Barrier (下)
linux·网络·算法·架构·dpdk
Discipline~Hai4 小时前
ARM01-ARM体系架构
linux·c语言·arm开发·架构
RisunJan4 小时前
Linux命令-screen(终端复用器)
linux·运维
啊哦1115 小时前
安装VMware Workstation
linux·运维·服务器
持敬chijing5 小时前
Linux基础命令与目录命令
linux·运维·服务器
yunwei375 小时前
实证研究:AI Agent 规则需要上下文与分层强制执行
linux·安全·ai编程
小张成长计划..6 小时前
【Linux】12:进程状态
linux·运维·服务器
会周易的程序员6 小时前
Libnodave S7 通信库:架构设计与实现解析
linux·c++·物联网·架构·c·s7·工业协议