文章目录
目录
题目
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 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
思路
这个题的总体思路与合并两个有序链表 类似,见代码
代码
这是有lists[]中元素有头结点的代码
#include<stdio.h>
#include<stdlib.h>
typedef struct ListNode {
int val;
struct ListNode *next;
}Node;
void Creat(struct ListNode** head);
struct ListNode* mergeKLists(struct ListNode** lists, int listsSize);
int main()
{
Node*link1,*link2,*link3;
Creat(&link1);
Creat(&link2);
Creat(&link3);
Node*list[3]={link1,link2,link3};
Node*res=mergeKLists(list,3);
res=res->next;
while(res!=NULL)
{
printf("%d ",res->val);
res=res->next;
}
return 0;
}
struct ListNode* mergeKLists(struct ListNode** lists, int listsSize)
{
for(int i=1;i<listsSize;i++)
{
struct ListNode*ins=lists[0];
if(ins==NULL)
{
return lists[0];
}
if(lists[i]==NULL)
{
continue;
}
lists[i]=lists[i]->next;
while(ins->next!=NULL&&lists[i]!=NULL)
{
if(ins->next->val<lists[i]->val)
{
ins=ins->next;
}
else if(ins->next->val>=lists[i]->val)
{
struct ListNode*temp=lists[i];
lists[i]=lists[i]->next;
temp->next=ins->next;
ins->next=temp;
ins=ins->next;
}
}
if(ins->next==NULL)
{
ins->next=lists[i];
}
}
if(lists==NULL)
return NULL;
return lists[0];
}
void Creat(struct ListNode** head)
{
*head=(Node*)malloc(sizeof(Node));
int n;
(*head)->next=NULL;
scanf("%d",&n);
Node*end,*ins;
end=*head;
for(int i=0;i<n;i++)
{
ins=(Node*)malloc(sizeof(Node));
int a;
scanf("%d",&a);
ins->val=a;
ins->next=NULL;
end->next=ins;
end=ins;
}
}
而LeetCode上lists[i]是没有头结点的,主要函数代码是:
struct ListNode* mergeKLists(struct ListNode** lists, int listsSize)
{
int less=INT_MAX,t=0;
struct ListNode*ins;
for(int i=0;i<listsSize;i++)
{
if(lists[i]!=NULL&&lists[i]->val<less)
{
ins=lists[i];
t=i;
less=lists[i]->val;
}
}
for(int i=0;i<listsSize;i++)
{
ins=lists[t];
if(lists[i]==NULL||i==t)
{
continue;
}
while(ins->next!=NULL&&lists[i]!=NULL)
{
if(ins->next->val<lists[i]->val)
{
ins=ins->next;
}
else if(ins->next->val>=lists[i]->val)
{
struct ListNode*temp=lists[i];
lists[i]=lists[i]->next;
temp->next=ins->next;
ins->next=temp;
ins=ins->next;
}
}
if(ins->next==NULL)
{
ins->next=lists[i];
}
}
if(listsSize==0)
return NULL;
return lists[t];
}
总结
以上就是今天要讲的内容,继续练习。