**
7-2 两个有序链表序列的交集 (15 分)
**
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。
输入样例:
1 2 5 -1
2 4 5 8 10 -1
//结尾无空行
输出样例:
2 5
//结尾无空行
#include <stdio.h>
#include <stdlib.h>
#define INCRESIZE 100
typedef struct node{
int data;
struct node *next;
}lnode,*linklist;
void initlist(linklist *l){//头指针
*l=(linklist)malloc(sizeof(lnode));
(*l)->next=NULL;
}
int initlist1(linklist *l){//头指针
*l=(linklist)malloc(sizeof(lnode));
if(!*l)
return 0;
(*l)->next=NULL;
return 1;
}
void inputlist2(linklist l){//尾接法
int x;
linklist p,r;
r=l;
scanf("%d",&x);
while(x!=-1){
p=(linklist)malloc(sizeof(lnode));
p->data=x;
r->next=p;
r=p;
scanf("%d",&x);
}
r->next=NULL;
}
void unionlist(linklist la,linklist lb,linklist lc){//链表交集
linklist pa,pb,pc,q,r;
pa=la->next;
pb=lb->next;
pc=lc;
while(pa!=NULL&&pb!=NULL){
if(pa->data==pb->data){
pc->next=pa;
pa=pa->next;
pb=pb->next;
pc=pc->next;
}
else if(pa->data<pb->data){
pa=pa->next;
}
else if(pa->data>pb->data){
pb=pb->next;
}
}
}
void outputlist(linklist l){//输出
linklist p;
p=l->next;
if(p==NULL){
printf("NULL");
}
else{
while(p)
{
printf("%d",p->data);
if(p->next)
printf(" ");
p=p->next;
}
}
}
int main(int argc, const char * argv[]) {
linklist l1,l2,l3;
initlist(&l1);
initlist(&l2);
initlist(&l3);
inputlist2(l1);
inputlist2(l2);
unionlist(l1,l2,l3);
outputlist(l3);
return 0;
}