题目大意:给出两个用链表储存的单词,问这两个链表公共后缀的首地址,若没有相同后缀,输出-1。
思路:虽然题目给出是链表,但是并不需要使用链表,只需要通过一个数组来映射这种当前结点与其后继的关系。如果使用map每次查询会需要log(n)的时间,而直接用数组则是O(1)的查询时间。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
using namespace std;
const int N=1e6+5;
int vis[N],mp[N];
int main(){
int a1,a2,n;
memset(vis,0,sizeof(vis));
memset(mp,-1,sizeof(mp));
scanf("%d%d%d",&a1,&a2,&n);
for(int i=0;i<n;i++){
int pre,nx;
char s[5];
scanf("%d%s%d",&pre,s,&nx);
mp[pre]=nx;
}
for(;;){
if(a1==-1) break;
vis[a1]=1;
a1=mp[a1];
}
for(;;){
if(a2==-1) break;
if(vis[a2]){
printf("%05d\n",a2);
return 0;
}
a2=mp[a2];
}
printf("-1\n");
return 0;
}