PAT_A1032
PAT甲级1032.
目录
A1032
题目
样例
样例1
输入:
11111 22222 9
67890 i 00002
00010 a 12345
00003 g -1
12345 D 67890
00002 n 00003
22222 B 23456
11111 L 00001
23456 e 67890
00001 o 00010
输出:
67890
样例2
输入:
00001 00002 4
00001 a 10001
10001 s -1
00002 a 10002
10002 t -1
输出:
-1
思路和坑点
寻找两个链表的重合点。给节点多一个标记为,访问过标记为1,否则是0。第一个链表访问时候进行标记,第二个链表进行访问的时候如果遇到了已经访问过得,便是公共部分,或者没有公共结点,输出-1.
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef struct node{
char data;
int next,tag;
node(){
tag=0;
}
}Node;
Node a[100000];
int main(void){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
int head1,head2,n;
scanf("%d %d %d",&head1,&head2,&n);
getchar(); //吸收换行符
for(int i=0;i<n;i++){
int id;
scanf("%d",&id);
scanf(" %c %d",&a[id].data,&a[id].next);
getchar(); //吸收换行符
}
for(int i=head1;i!=-1;i=a[i].next) //对第一个链表进行遍历,并作标记
a[i].tag=1;
int i;
for(i=head2;i!=-1;i=a[i].next){ //遍历第二个链表,如果到了已标记处,说明是重合部分,否则到最后的-1
if(a[i].tag==1)
break;
}
if(i==-1) printf("-1");
else printf("%05d",i);
return 0;
}