题目
题目大意
有两个字母链表分别表示两个单词,给出这两个链表的起始位置和总节点数,要求求出两个单词相同后缀的起始地址。如果没有相同后缀,就输出-1。
思路
相同后缀就是两条链表的重合位置,后缀的起始地址就是重合位置的第一个地址。标记第一条链表,将第一条链表和第二条链表区分开。遍历第二条链表中的某个节点,发现其已在第一条链表中,由于链表的特性,接下来的节点一定会重合,则该节点即为后缀起始位置。
可以用结构体数组表示链表,节点地址即为下标,每个节点存储当前节点的值和下一个节点的地址,再加一个标志位flag,判断是否在第一条链表中。
注意结构化输出%05d。
代码
#include <iostream>
using namespace std;
struct node{
char data; // 当前节点表示的值
int next; // 下一个节点的地址
bool flag; // 是否位于第一个链表中
}v[100000];
int s1, s2, n;
int main(){
cin >> s1 >> s2 >> n;
for (int i = 0; i < n; i++){
int ads;
cin >> ads;
cin >> v[ads].data >> v[ads].next;
v[ads].flag = false;
}
for (int i = s1; i != -1; i = v[i].next){
v[i].flag = true;
} // 标记第一条链表中的节点
for (int i = s2; i != -1; i = v[i].next){
if (v[i].flag){
printf("%05d", i); // 测试点4,没有补0就会错
return 0;
} // 遍历第二条链表,第一个在第一条链表中的节点地址即为后缀的起始位置
}
cout << "-1" << endl;
return 0;
}