题目大意:给出两个链表的头节点地址,和N个节点,判断从哪个节点开始,两个链表重合。
先用vector<int> 存储两个完整的链表,然后从两个链表的最后向前遍历,直到两个元素不相同。需要考虑的特殊情况有两个:①某个链表是另外一个链表的一部分,这样退出循环时的下标也是0。②某个链表为空,这样会造成下标越界。可以在这两个vector的开头另外分别加上一个不相同的元素,这样,保证在遍历到下标为0之前可以退出循环,并且不会下标越界。
AC代码如下:
#include <vector>
#include <cstdio>
using namespace std;
int list[100010] = {0};
int main()
{
int s1, s2, N;
scanf("%d%d%d", &s1, &s2, &N);
for (int i = 0; i < N; ++i)
{
int address, next;
char data;
scanf("%d %c %d", &address, &data, &next);
list[address] = next;
}
vector<int> v1, v2;
v1.push_back(1);
v2.push_back(-1);
for (int p = s1; p != -1; p = list[p])
{
v1.push_back(p);
}
for (int p = s2; p != -1; p = list[p])
{
v2.push_back(p);
}
int i = v1.size() - 1, j = v2.size() - 1;
while(i > 0 && j > 0 && v1[i] == v2[j])
{
if(v1[i-1] != v2[j-1]) break;
i--;
j--;
}
if(v1[i] == v2[j]) printf("%05d", v1[i]);
else printf("-1");
return 0;
}