本题在运行时可能会出现问题,如果有人用了我的代码并遇到的话希望能告诉我。
题目如下:
合并 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
#include <stdio.h>
#include <stdlib.h>
#define length 3 //主要是便于修改length的值
#define LEN sizeof(struct listnode)
typedef struct listnode{
int data;
struct listnode *next;
}listnode,*linklist;
int main()
{
linklist list[length],c;
linklist creat(),mergek(linklist l[],int n);
for(int i=0;i<length;i++)
{
printf("输入第%d个链表:",i);
list[i]=creat();
}
c=mergek(list,length);
printf("合并后的链表为:");
while(c)
{
printf("%d",c->data);
c=c->next;
}
return 0;
}
linklist mergek(linklist l[],int n)
{
linklist merge(linklist a,linklist b);
int interval=1;
while(interval<n)
{
for(int i=0;i<n-interval;i=i+interval*2)
{
l[i]=merge(l[i],l[i+interval]);
}
interval*=2;
}
return l[0];
}
linklist merge(linklist l1,linklist l2)
{
linklist head=(linklist)malloc(sizeof(LEN)),s;
s=head;
while(l1!=NULL&&l2!=NULL)
{
if(l1->data<l2->data)
{
s->next=l1;
l1=l1->next;
}
else
{
s->next=l2;
l2=l2->next;
}
s=s->next;
}
if(l1!=NULL)
{
s->next=l1;
s=s->next;
}
else
{
s->next=l2;
s=s->next;
}
s->next=NULL;
return head->next;
}
linklist creat(linklist L)
{
linklist s,r;
int x;
L=(linklist)malloc(sizeof(LEN));
r=L;
scanf("%d",&x);
while(x!=9999)
{
s=(linklist)malloc(sizeof(LEN));
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);
}
r->next=NULL;
return L->next;
}