已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。
输入样例:
1 2 5 -1
2 4 5 8 10 -1
输出样例:
2 5
思路:使用数组存储一维单链表:int h1=-1,e1[N],ne1[N],idx1=0;
使用栈把相同的元素输出(不能直接输出,因为单链表是倒着进行存储的,输出时应该倒着输出)。
#include<iostream>
#include<stack>
using namespace std;
const int N = 10000001;
int h1=-1,e1[N],ne1[N],idx1=0;
int h2=-1,e2[N],ne2[N],idx2=0;
void add1(int x)
{
e1[idx1]=x;
ne1[idx1]=h1;
h1=idx1++;
}
void add2(int x)
{
e2[idx2]=x;
ne2[idx2]=h2;
h2=idx2++;
}
int main()
{
int x;
while(scanf("%d",&x)!=EOF)
{
if(x==-1) break;
add1(x);
}
while(scanf("%d",&x)!=EOF)
{
if(x==-1) break;
add2(x);
}
int i=h1,j=h2;
stack<int> stk;
int co=0;
while(i!=-1 && j!=-1){
if(e1[i]==e2[j])
{
stk.push(e1[i]);
i=ne1[i];
j=ne2[j];
co++;
}
else if(e1[i]>e2[j]){
i=ne1[i];
}
else
j=ne2[j];
}
if(co==0) printf("NULL");
else{
printf("%d",stk.top());
stk.pop();
while(stk.size())
{
printf(" %d",stk.top());
stk.pop();
}
}
return 0;
}