#include <cstdio>
struct List{
char c;
int next;
bool flag;
List(){
flag = false;
}
}L[100010];
int main(){
int h1, h2, n;
scanf("%d %d %d", &h1, &h2, &n);
int ta, next, tc;
for(int i=0; i<n; i++){
scanf("%d %c %d", &ta, &tc, &next);
L[ta].c = tc;
L[ta].next = next;
}
int temp;
while(h1!= -1){
L[h1].flag = true;
h1 = L[h1].next;
}
while(h2 != -1){
if(L[h2].flag == 1){
printf("%05d", h2);
return 0;
}
h2 = L[h2].next;
}
printf("-1");
return 0;
}
非常に単純な静的リンクリストの問題ですが、最初のリンクリストのノードアドレスが2番目のリンクリストに表示されるかどうかを最初から列挙していたため、2つのテストポイントタイムアウトを記述し始めました。時間計算量はO(n ^ 2)に達しました。 )。
この本の独創的な解決策を読んだ後、私は突然、最初のリンクリストをトラバースし、ノードが訪問されたかどうかを記録するブール変数を設定したことに気付きました。次に、2番目のリンクリストを再度トラバースし、リンクリストが最初にアクセスしたノードが見つかるとすぐにアドレスを出力します。