【思路】先求出两个链表的长度,假设长度分别为l1、l2(l1 > l2), 较长的从l1-l2+1开始遍历,最终它们一定会相遇。
#include<iostream>
using namespace std;
const int N = 100010;
int ne[N];
char cha[N];
int main()
{
int b1, b2, n;
cin >> b1 >> b2 >> n;
for(int i = 0; i < n; i++)
{
int addre, next;
char c;
cin >> addre >> c >> next;
ne[addre] = next;
cha[addre] = c;
}
// 求两链表的长度
int len1 = 0, len2 = 0;
for(int i = b1; i != -1; i = ne[i]) len1++;
for(int i = b2; i != -1; i = ne[i]) len2++;
int p1 = b1, p2 = b2;
if(len1 > len2)
{
while(len1 - len2 > 0)
{
p1 = ne[p1];
len1--;
}
}
else {
while(len2 - len1 > 0)
{
p2 = ne[p2];
len2--;
}
}
while(p1 != -1 && p2 != -1)
{
if(p1 == p2) break;
p1 = ne[p1];
p2 = ne[p2];
}
if(p1 != -1 && p2 != -1) printf("%05d\n", p1);
else puts("-1");
return 0;
}