解题思路:
静态链表的操作,找链表相同后缀,只需求出两条链表的长, 将长的链表上的指针先走到后缀和短链表长度
一致时,再两个链表同时走,直到找到相同的结点。
注意空表的处理。
代码如下:
#include<cstdio>
const int maxn = 100000 + 5;
struct Node
{
char c;
int next;
} node[maxn];
int main()
{
int s1, s2, n;
while(scanf("%d%d%d", &s1, &s2, &n) == 3)
{
if(s1 == -1 || s2 == -1 || n == 0) {printf("-1\n"); continue;}
for(int i = 0; i < n; i++)
{
int a, b;
char c;
scanf("%d %c %d", &a, &c, &b);
node[a].c = c;
node[a].next = b;
}
int p = s1, q = s2, len1 = 1, len2 = 1;
while(node[p].next != -1) {p = node[p].next; len1++;} // 求表长
while(node[q].next != -1) {q = node[q].next; len2++;}
p = s1;q = s2;
while(node[p].next != -1 && len1 > len2) {p = node[p].next; len1--;} //长的链表先走
while(node[q].next != -1 && len1 < len2) {q = node[q].next; len2--;}
while(p != q) // 同时开始走,直到结点相同
{
p = node[p].next;
q = node[q].next;
}
if(p != -1)
printf("%05d\n", p);
else
printf("-1\n");
}
return 0;
}