题意
给出两条链表的首地址以及若干结点的地址、数据、下一个结点的地址,求两条链表的首个共用结点的地址。如果两条链表没有共用结点,则输出-1。
思路
- 由于地址的范围很小,因此可以直接用静态链表,但是依照题目的要求,在结点的结构体中再定义一个bool型变量visited,表示结点是否在第一条链表中出现,是则为true。
- 由题目给出的第一条链表的首地址出发遍历第一条链表, 将经过的所有结点的visited值赋为true。
- 接下来枚举第二条链表,当出现第一个visited值为true的结点,说明是第一条链表中出现过的结果,即为两条链表的第一个共用结点。
- 如果第二条链表枚举完仍然没有发现共用结点,则输出-1。
注意点
- 使用%05d格式输出地址,可以使不足5位的整数的高位补0。
- scanf使用%c格式时是可以读入空格的,因此在输入地址、数据及后继结点地址时,格式不能写成%d%c%d,必须在中间加空格。
const int N=1e5+10;
struct Node {
char data;
int nxt;
bool visited;
}a[N];
int head1,head2;
int n;
int main()
{
cin>>head1>>head2;
cin>>n;
for(int i=0;i<n;i++)
{
int addr,nxt;
char data;
cin>>addr>>data>>nxt;
a[addr]={data,nxt};
}
int p1 = head1;
while(p1 != -1)
{
a[p1].visited = true;
p1 = a[p1].nxt;
}
int p2 = head2;
int ans=-1;
while(p2 != -1)
{
if(a[p2].visited)
{
ans = p2;
break;
}
p2 = a[p2].nxt;
}
if(~ans) printf("%05d
",ans);
else puts("-1");
//system("pause");
return 0;
}