题目
给出两条链表的首地址以及若干结点的地址、数据、下一个结点的地址,求两条链表的首个共用结点的地址。如果两条链表没有共用结点,则输出-1.
思路
(1)由于地址的范围很小,因此可以直接用静态链表,但是依照题目的要求,在结点的结构体中再定义一个int型变量flag,表示结点是否在第一条链表中出现,是则为1,不是为-1.
(2)由题目给出的第一条链表的首地址出发遍历第一条链表,将经过的所有结点的flag值赋为1.
接下来枚举第二条链表,当出现第一个flag值为1的结点,说明第一条链表中出现过的结果,即为两条链表的第一个共用结点。如果第二条链表枚举完仍然没有发现共用结点,则输出-1.
注意点
(1)使用%05d格式输出地址,可以使不足5位的整数的高位补0;
(2)使用map容易超时
(3)scanf使用%c格式时是可以读入空格的,因此在输入地址、数据、后继结点地址时。格式不能写成%d%c%d,必须在中间加空格。
#include<cstdio>
#include<cstring>
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;
scanf("%d%