http://pat.zju.edu.cn/contests/pat-a-practise/1032
用数组实现静态链表,并不对字符操作,所以不需要设置结构体,只用保存下一结点地址即可
定义标技术组mark[i],与node[i]相对应,遍历一趟第一个链表,将所有点标记已访问
遍历第二个链表,若访问到已访问过的结点则说明,两链表相交,输出此时地址即可
#include <stdio.h>
#include <string.h>
int node[100010],mark[100010];
int main()
{
int start1,start2,n; //第一个链表的开始,第二个链表的开始
int from,to; //模拟实现指针next功能
char s[2]; //保存字符
memset(node,-1,sizeof(node));
memset(mark,0,sizeof(mark));
scanf("%d%d%d",&start1,&start2,&n);
while (n--)
{
scanf("%d%s%d",&from,s,&to);
node[from]=to; //地址from处保存下一结点的地址to
}
while (start1!=-1) //遍历第一个链表,置已访问
{
mark[start1]=1;
start1=node[start1];
}
while (start2!=-1) //遍历第二个链表
{
if (mark[start2]) //结点已访问过,说明相交
{
printf("%.5d\n",start2); //输出当前地址
return 0;
}
start2=node[start2];
}
printf("-1\n"); //不想交
return 0;
}