已知两个非降序链表序列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 LNode *List;
struct LNode
{
ElementType Data;
struct LNode *next;
};
List Read()
{
List P,L;
L = (List)malloc(sizeof(struct LNode));
L->next = NULL;
P = L;
int a; //
while (1)
{
scanf_s("%d", &a); if (a == -1) break;
List S = (List)malloc(sizeof(struct LNode));
S->Data = a;
S->next = NULL;
L->next = S;
L = S;
}
return P;
}
List Merge(List S1, List S2)
{
List p, L;
p = (List)malloc(sizeof(struct LNode));
p->next = NULL;
L = p;
S1 = S1->next;
S2 = S2->next;
while (S1&&S1)
{
if (S1->Data>S2->Data)
{
S2 = S2->next;
}
else if(S1->Data<S2->Data)
{
S1 = S1->next;
}
else
{
p->next = S1;
S1 = S1->next;
S2 = S2->next;
p = p->next;
}
}
p->next = NULL;
return L;
}
void PrintList(List S3)
{
int flag = 0;
S3 = S3->next;
while (S3 != NULL)
{
if (flag)
{
printf(" ");
}
printf("%d", S3->Data);
S3 = S3->next;
flag = 1;
}
if (!flag)
printf("NULL");
}
int main()
{
List S1, S2, S3;
S1 = Read();
S2 = Read();
S3 = Merge(S1, S2);
PrintList(S3); while(1);
return 0;
}