题目:
已知两个递增链表LA,LB分别表示集合A,B,设计算法实现,求集合A,B的交集。用递增的方式存储链表LC,并且求解时间尽可能地小。
时间复杂度为两个链表数目之和O(m+n):
// IntersectionLink.cpp : 定义控制台应用程序的入口点。
//算法描述,la,lb递增链表,lc为两者的交集,也是递增的。
#include <stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node* next;
}Link;
//链表初始化 必须建立递增的链表
Link* CreateLa(Link *head,int n)
{
Link *p;
//头插法
//for(int i=0;i<n;i++)
//{
// p = (Link *)malloc(sizeof(Link));
// p->data = 2*i;
// p->next = head->next;
// head->next = p;
//}
//尾插法
for(int i=0;i<n;i++)
{
p = (Link *)malloc(sizeof(Link));
p->data = 2*i;
head->next = p;
head = p;
}
head->next = NULL;
return head;
}
Link* CreateLb(Link *head,int n)
{
Link *p;
//尾插法
for(int i=0;i<n;i++)
{
p = (Link *)malloc(sizeof(Link));
p->data = i+1;
head->next = p;
head = p;
}
head->next = NULL;
return head;
}
void Print(Link *head)
{
Link *p = head->next;
while(p!=NULL)
{
printf("%d\t",p->data);
p = p->next;
}
}
Link *Intersection(Link *La,Link *Lb,Link *Lc)
{
Link *pa,*pb,*pc,*p;
pc = Lc;
pa = La->next;
pb = Lb->next;
while(pa!=NULL&&pb!=NULL)
{
if(pa->data<pb->data)
{
pa = pa->next;
}
if(pa->data>pb->data)
{
pb = pb->next;
}
else
{
p = (Link *)malloc(sizeof(Link));
p->data = pa->data;
pc->next = p;
pc = p;
pa = pa->next;
pb = pb->next;
}
}
pc->next = NULL;
return Lc;
}
int main()
{
int a,b;
Link *La,*Lb,*Lc;
La = (Link *)malloc(sizeof(Link));
Lb = (Link *)malloc(sizeof(Link));
Lc = (Link *)malloc(sizeof(Link));
La->next = NULL;
Lb->next = NULL;
Lc->next = NULL;
printf("请输入链表a的数目:");
scanf("%d",&a);
printf("\n请输入链表b的数目:");
scanf("%d",&b);
CreateLa(La,a);
printf("链表la为:\n");
Print(La);
CreateLb(Lb,b);
printf("\n链表lb为:\n");
Print(Lb);
Intersection(La,Lb,Lc);
printf("\n链表lc为:\n");
Print(Lc);
puts("\n");
system("pause");
}