题目来源
题目描述
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 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
题目限制
用最优解做出来
思路分析
在解决给定多个按升序排列的链表,将它们合并为一个升序链表的问题时,一种常见思路是采用顺序合并。先实现一个能合并两个有序链表的函数,通过比较节点值大小依次连接节点来合并。在合并多个链表的主函数里,先处理边界情况,如链表数组为空或元素全为空链表时直接返回相应结果,若有有效链表,则先取第一个链表作为初始合并结果,随后从第二个链表起循环调用合并两链表的函数,不断更新合并结果,直至处理完所有链表,最终返回合并好的链表头节点,其时间复杂度为 O(kn)( k为链表个数, n为平均链表长度),空间复杂度为 O(1)。
具体代码
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* mergeTWOLists(ListNode* a,ListNode* b) {
ListNode *xt=new ListNode(-1);
ListNode *tail=xt;
while(a&&b)
{
if(a->val<b->val)
{
tail->next=a;
a=a->next;
}
else
{
tail->next=b;
b=b->next;
}tail=tail->next;
}
if(a)tail->next=a;
else tail->next=b;
return xt->next;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.empty())return nullptr;
ListNode *res=lists[0];
for(int i=1;i<lists.size();i++)
{
if(lists[i])res=mergeTWOLists(res,lists[i]);
}return res;
}
};
这段代码中,Solution
类里的mergeTwoLists
函数用于合并两个有序链表,通过创建虚拟头节点,利用循环比较两链表当前节点值大小并按需连接,循环结束后处理剩余节点,最终返回合并后链表头节点;mergeKLists
函数则是处理多个有序链表的合并,先判断链表数组是否为空,非空时取首个链表为初始结果,再循环调用mergeTwoLists
函数依次合并剩余链表,最后返回合并好的完整有序链表的头节点,整体实现了将多个升序链表合并为一个升序链表的功能。