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);  //返回分割的链表
    }
};
复制代码
相关推荐
行止613 分钟前
系统安全及应用
linux·运维·安全
再看扣你眼18 分钟前
系统安全及应用深度笔记
linux·运维·笔记·安全·系统安全
铃木隼.19 分钟前
系统安全应用
linux·运维·系统安全
exe4521 小时前
力扣每日一题5-18
java·算法·leetcode
Eric.Lee20211 小时前
Ubuntu系统安装VsCode
linux·vscode·ubuntu
阳洞洞1 小时前
leetcode 74. Search a 2D Matrix
leetcode·二分查找
YuforiaCode1 小时前
LeetCode 219.存在重复元素 II
算法·leetcode·职场和发展
小雅痞1 小时前
[Java][Leetcode middle] 151. 反转字符串中的单词
java·leetcode
hellolxb2 小时前
Unreal Engine: Windows 下打包 AirSim项目 为 Linux 平台项目
linux·游戏引擎·虚幻
RLG_星辰2 小时前
SHELL练习题(1-11题)记录(牛客)
linux·运维·服务器·shell