将两条链表长度划分为X + Z, Y + Z (Z为公共部分)
到达链尾就从另一个链表头结点继续走
1. 如果共享一个子链 X + Z + Y = Y + Z + X 一定在相交的子链入口处结束
2. 如果不同共享子链 X + Y = Y + X 到达链尾结束
C++ 代码
#include <iostream>
#include <algorithm>
using namespace std;
const int MAX_N = 100010;
int ne[MAX_N];
int main() {
int head1, head2, n;
cin >> head1 >> head2 >> n;
for (int i = 0; i < n; i++) {
int addr, nextAddr;
char data;
cin >> addr >> data >> nextAddr;
ne[addr] = nextAddr;
}
int i = head1, j = head2;
if (i != -1 && j != -1) {
while (i != j) {
if (i == -1) i = head2;
if (j == -1) j = head1;
i = ne[i];
j = ne[j];
}
}
if (i == -1 || j == -1) puts("-1");
else printf("%05d\n", i);
return 0;
}
N!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
这思路太顶了!
这里为什么要先要用if进行特判
特判有空链表的情况,只要有一个是空链表,必然没有交点