INPUT
第一行包含两个结点的地址和一个正整数N,两个地址是两个单词的第一个结点地址,N是结点总数。结点地址是5位正整数,用-1代表NULL。
N行:
Add是结点的位置,Data是这个结点包含的字母,Next是下一个结点的地址
OUTPUT
输出共同后缀的开始位置。如果两个单词没有共同后缀,输出 -1
思路:
①使用 静态链表 存储结点的 字母data、下一个结点地址next,当前地址就是这个结点的数组下标;
②因为链表的特殊性,当两个链表出现公共结点的时候,肯定后面的结点都是相同的。所以只要找到第一个相同的结点。
③根据②,首先遍历第一条链表,把所有出现过的结点都设置为true,再遍历第二条链表,遇到true就说明遇到了相同的结点。
代码:
#include <cstdio>
const int maxn = 100010;
// 一、定义静态链表
struct Node {
int add;
char data;
int next;
bool flag;
}node[maxn];
int main() {
// 二、初始化
for (int i = 0; i < maxn; i++) {
node[i].flag = false;
}
int s1, s2, n, add;
scanf("%d%d%d", &s1, &s2, &n);
// 录入结点信息
for (int i = 0; i < n; i++) {
scanf("%d", &add);
scanf(" %c %d", &node[add].data, &node[add].next);
}
// 三、遍历链表
for (int p = s1; p != -1; p = node[p].next) {
node[p].flag = true;
}
int p;
for (p = s2; p != -1; p = node[p].next) {
if (node[p].flag == true)
break;
}
if (p == -1) { // p遍历到最后也在找到
printf("-1\n");
}
else {
printf("%05d\n", p); //如果不补齐5位数,则测试点4错误
}
return 0;
}