合并k个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
(
1→4→5
1→3→4
2→6
]
输出:1→1→2→3→4→4→5→6
力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-k-sorted-lists
代码>
/*
解题思路:
解法一,顺序合并
1、列表[0][1]与列表合并,结果与列表[2]合并……结果与列表(listsSize-1)合并
解法二,分治合并
1、列表[0][1]与列表合,并列表[2][3]合与列表并,然后将合并的结果继续合并。
*/代码>
解法二,分治合并
/*
标题:leetcode23。合并K个排序链表
作者:xidoublestar
方法:顺序合并
类型:C
日期:2020-5-27
*/struct ListNode * mergeTwoLists (struct ListNode * l1, l2 struct ListNode *) {
如果l1 (!)
返回l2;
如果l2 (!)
返回l1;
struct ListNode *头=(struct ListNode *) malloc (sizeof (struct ListNode)) *尾=头;
而(l1,,l2) {
如果(l1→val & lt;l2→val) {
尾巴→下=l1;
l1=l1→下;
}
其他{
尾巴→下=l2;
l2=l2→下;
}
尾=尾→下;
}
如果尾巴(l1)→下一个=l1;
else if (l2)尾部→下=l2;
尾=头;
头=头→下;
免费(尾);
返回头;
}
struct ListNode * mergeKLists (struct ListNode * *列表,int listsSize) {
如果(listsSize==0)
返回NULL;
struct ListNode * res=*列表;
for (int i=1;我& lt;listsSize;我+ +)
{
如果(列表[我]!=NULL)
res=mergeTwoLists (res、列表[我]);
}
返回res;
}
代码>
/*
标题:leetcode23。合并K个排序链表
作者:xidoublestar
方法:顺序合并
类型:C
日期:2020-5-27
*/struct ListNode * mergeTwoLists (struct ListNode * l1, l2 struct ListNode *) {
如果(l1 (!) | | (l2))返回l1吗?l1, l2;
struct ListNode头;
头。下一个=零;
struct ListNode *尾=,头;
而(l1,,l2) {
如果(l1→val & lt;l2→val) {
尾巴→下=l1;
l1=l1→下;
}
其他{
尾巴→下=l2;
l2=l2→下;
}
尾=尾→下;
}
下=l1尾巴→吗?l1, l2;
返回head.next;
}
struct ListNode *合并(struct ListNode * *列表,int, int) {
如果(左==)
返回列表(左);
如果(左比;右)
返回NULL;
int中期=(左+右)在祝辞1;
struct ListNode * p1=合并(列表,左,中期);
struct ListNode * p2=合并(列表、中期+ 1右);
返回mergeTwoLists (p1, p2);
}
struct ListNode * mergeKLists (struct ListNode * *列表,int listsSize) {
如果(listsSize==0)
返回NULL;
返回合并(列表、0 listsSize - 1);
}
代码>