题目大意
求两个链表的首个共同结点的地址。如果没有,就输出-1思路解析
先遍历第一条链表,将经过的结点的isvisited都标记为true,当遍历第二条结点的时候,如果遇到了true的结点就输出并结束程序,没有遇到就输出-1。其实这里有个坑,专门坑一些有代码洁癖和时间洁癖的人,比如我……成功被PAT数据gank,我第一遍做的时候,没有单独遍历第一个链表,而是在每一个结构体里面加了一个count,在输入的时候每个节点的next所指节点count++,最后count == 2的节点就是所求节点。这样时间复杂度就降到了2n,首先思路是正确的,代码也没问题,最后提交结果只得了23分,第4个测试点就是过不去。各种猜测难不成是循环链表?最后想明白了,PAT的数据里有“脏节点”,也就是说有一些不在单词字母内的“垃圾节点”,但这些“脏节点”却指向了“有效节点”这就导致了我的count出现了问题。以后做PAT链表题的时候一定要长个记性。
示例代码
#include<iostream>
#include<string>
#include<vector>
using namespace std;
struct node{
public:
int next = -1;
bool visited = false;
char data;
};
int main() {
int add1, add2, n;
vector<node> vec(100010);//角标就是地址
cin >> add1 >> add2 >> n;
for (int i = 0; i < n; i++) {
int a;
cin >> a;
cin >> vec[a].data >> vec[a].next;
}
for (int i = add1; i != -1; i = vec[i].next)
vec[i].visited = true;
for (int i = add2; i != -1; i = vec[i].next) {
if (vec[i].visited) {
printf("%05d", i);
return 0;
}
}
printf("-1");
return 0;
}