这里是写了两个有序链表的合并算法,相比较来说这个算法的时间复杂度和空间复杂度都是0(m+n)
没有开辟新的空间,并且只需要遍历一次。
#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;
typedef struct Lnode{
Elemtype data;
struct Lnode *next;
}Lnode,*LinkList;
LinkList Create(LinkList &L)
{
L=(LinkList)malloc(sizeof(Lnode));
L->next=NULL;
Elemtype x;
scanf("%d",&x);
while(x!=9999)
{
LinkList s=(LinkList)malloc(sizeof(Lnode));
s->data=x;
s->next=L->next;
L->next=s;
scanf("%d",&x);
}
return L;
}
void print(LinkList L)
{
LinkList q=L->next;
while(q!=NULL)
{
printf("%3d",q->data);
q=q->next;
}
printf("\n");
}
LinkList Create_2(LinkList &L)
{
LinkList r,s;
L=(LinkList)malloc(sizeof(Lnode));
r=L;
Elemtype x;
scanf("%d",&x);
while(x!=9999)
{
s=(LinkList)malloc(sizeof(Lnode));
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);
}
r->next=NULL;
return L;
}
//要求不开辟新的空间时间复杂度和空间复杂度都为0(n)
LinkList Merge(LinkList &L1,LinkList &L2)
{
LinkList r=L1;
LinkList q=L1->next;
LinkList s=L2->next;
while(q!=NULL&&s!=NULL)
{
if(q->data<=s->data)
{
r->next=q;
r=q;
q=q->next;
}else
{
r->next=s;
r=s;
s=s->next;
}
}
if(q!=NULL)
{
r->next=q;
}
else
{
r->next=s;
}
free(L2);
return L1;
}
int main(){
LinkList L1;
LinkList L2;
printf("请开始输入数字并且以9999作为结束标志");
Create_2(L1);
print(L1);
printf("请开始输入数字并且以9999作为结束标志");
Create_2(L2);
print(L2);
Merge(L1,L2);
print(L1);
return 0;
}