这一题要说一下,输入格式里面直到-1才是一条链表的结束
思路是使用静态链表保存两个链表的数据,并且查询有无共用节点
《算法笔记》P263
另外这一题里面重点还有for循环的这种枚举方式:
for(p = s1;p != -1;p = node[p].next){
node[p].flag = true;
}
#include <cstdio>
#include <string.h>
const int maxn = 100010;
struct NODE{
char data;//数据域
int next;//指针域
bool flag;//节点是否在第一条链表中出现
}node[maxn];
int main(){
for(int i = 0;i <maxn;i++){
node[i].flag = false;
}
int s1,s2,n;//s1与s2分别代表两条链表的首地址
scanf("%d%d%d",&s1,&s2,&n);
int address,next;//节点地址与后继节点地址
char data;
for(int i = 0;i <n;i++){
scanf("%d %c %d",&address,&data,&next);
node[address].data = data;
node[address].next = next;
}
int p;
for(p = s1;p != -1;p = node[p].next){
node[p].flag = true;//枚举第一条链表的所有节点,令其出现次数为1
}
for(p = s2;p != -1;p = node[p].next){
//找到第一个已经在第一条链表中出现的节点
if(node[p].flag == true) break;
}
if(p != -1){//如果第二条链表还没有到达结尾,说明找到了共用节点
printf("%05d\n",p);
}
else{//否则输出-1
printf("-1\n");
}
return 0;
}