已知两个非降序链表序列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>
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;
List Read();
void Print( List L );
List Merge( List L1, List L2 );
int main()
{
List L1, L2, L;
L1 = Read();
L2 = Read();
L = Merge(L1, L2);
Print(L);
return 0;
}
List Read() {
PtrToNode L,Head,Tail;
Head = Tail = NULL;
int i,x;
for (i=0;;i++) {
scanf ("%d",&x);
if (x==-1) break;
L = (List)malloc(sizeof(struct Node));
L->Data = x;
L->Next = NULL;
if (i==0) Head = L;
else Tail->Next = L;
Tail = L;
}
return Head;
}
List Merge( List L1, List L2 ) {
List L3,Head,Tail;
Head=Tail=L3=NULL;
while(L1&&L2){
if (L1->Data==L2->Data) {
L3 = (List)malloc(sizeof (struct Node));
L3->Data = L1->Data;
L3->Next = NULL;
L1=L1->Next;
L2=L2->Next;
}
else if(L1->Data<L2->Data){
L1=L1->Next;
}
else L2=L2->Next;
if (Tail==NULL) Head = L3;
else Tail->Next = L3;
Tail = L3;
}
return Head;
}
void Print( List L ) {
PtrToNode P;
P = L;
int t=0;
if(P==NULL) printf("NULL");
else{
while (P!=NULL) {
t++;
if (t!=1) printf (" ");
printf ("%d",P->Data);
P = P->Next;
}
}
}
/* #include<stdio.h>
int a[10000000],b[10000000];
int main()
{
int len1=0,len2=0;
while(1){
int x;
scanf("%d",&x);
if(x==-1)
break;
else
a[len1++]=x;
}
while(1){
int x;
scanf("%d",&x);
if(x==-1)
break;
else
b[len2++]=x;
}
int i=0,j=0,cnt=0;
while(i<len1&&j<len2){
if(a[i]==b[j]){
if(cnt==0)
printf("%d",a[i]);
else
printf(" %d",a[i]);
cnt++;
i++;
j++;
}
else if(a[i]<b[j]){
i++;
}
else
j++;
}
if(cnt==0)
printf("NULL\n");
else
printf("\n");
return 0;
}*/