题目的大致叙述如下所示:
简单来说,题目的大致需求就是给出两个链表,其中链表的一部分为共用部分,目的就是找到那个共用部分的第一个结点索引。
自己之前先动手实现了一遍,但是仿佛像一个弱智;当时自己想的反正要对比,就像排序那样对比两个序列,两个链表的元素挨个对比。但是忽略了一个问题,当前面不同链表个数相差个大的时候,总会有一个链表先穷尽,所以不可能找到交汇点。
至于书上和网上的思路是建立节点信息;进行两次遍历,对A链表遍历时打上标签,当进行B链表遍历的时候,如果访问到交汇点,必然会发现打上的标签,所以思路就既清晰又简单。
#include <cstdio>
#include<stdlib.h>
const int maxn = 100010;
//定义链表
struct Node {
int address, data, next;
int flag;
} node[maxn];
int main() {
//初始化
for(int i = 0; i < maxn; i++)
node[i].flag = 0;
//读取数据
int b1, b2, n;
int address, next;
char data;
scanf("%d %d %d", &b1, &b2, &n);
for(int i = 0; i < n; i++) {
scanf("%d %c %d", &address, &data, &next);
node[address].address = address;
node[address].data = data;
node[address].next = next;
}
//遍历链表标记特殊性质,此题不需要统计有效结
for(int i=b1;i!=-1;i=node[i].next){
node[i].flag=1;
}
int flag=-1;
//此题不需要排序,直接进行第⑤步
for(int i=b2;i!=-1;i=node[i].next){
if(node[i].flag==1){
flag=i;
break;
}
}
if(flag != -1)
printf("%05d", flag);
else
printf("-1\n", flag);
system("pause");
return 0;
}