7-6 两个有序链表序列的交集 (20 分)
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL
。
输入样例:
1 2 5 -1
2 4 5 8 10 -1
输出样例:
2 5
#include<bits/stdc++.h>
using namespace std;
typedef struct Node
{
int data;
Node* next;
Node(int data):data(data),next(NULL) {}
} List;
List* readL() ///读取数据并创建链表
{
int x;
List *L=new List(INT_MIN);
List *p,*r=L;
scanf("%d",&x);
while(x!=-1)
{
p=new List(x);
r->next=p;
r=p;
scanf("%d",&x);
}
return L;
}
void DispList(List *L) ///打印链表
{
if(L->next==NULL) printf("NULL\n");
else
{
List *p=L->next;
while(p)
{
if(p->next)
printf("%d ",p->data);
else
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
}
/*
List* mergeL(List *L1,List *L2) ///合并两个有序链表的代码
{
List *pre,*i=L1->next,*j=L2->next;
List *L=new List(INT_MIN);
pre=L;
while(i && j)
{
if(i->data<j->data)
{
pre->next=i;
pre=i;
i=i->next;
}
else{
pre->next=j;
pre=j;
j=j->next;
}
}
if(i) pre->next=i;
if(j) pre->next=j;
return L;
}
*/
///版本一:找两个链表的交集元素,并创建该链表,非有序也可用
/*
List *newL(List *L1,List *L2)
{
List *L=new List(INT_MIN);
List *i=L1->next,*j=L2->next,*pre=L;
while(i)
{
while(j)
{
if(i->data==j->data)
{
pre->next=i;
pre=i;
break;
}
j=j->next;
}
j=L2->next;
i=i->next;
//printf("YES\n");
}
return L;
}
*/
///版本二:只适用于两个有序链表
List *newL(List *L1,List *L2)
{
List *L=new List(INT_MIN);
List *i=L1->next,*j=L2->next,*pre=L;
while(i && j)
{
if(i->data<j->data) i=i->next;
else if(i->data>j->data) j=j->next;
else
{
pre->next=i;
pre=i;
i=i->next;
j=j->next;
}
}
return L;
}
int main()
{
List *L1=readL();
List *L2=readL();
List *L=newL(L1,L2);
DispList(L);
return 0;
}