原题链接:题目
写这篇就是为了总结一个套路出来,给自己提个醒:
题目意思:给出两个链表,求两个链表之间相同部分的首地址;
思路:
- 地址范围使用静态链表足够,一定要对其初始化
- 使用flag进行标记,看是否属于一个链表
- 枚举第一个链表,把flag设为true
- 枚举第二个链表,一个个递推下去,看是否这个的flag为true(若是true则表示是第一个链表中的数),跳出循环
- 判断循环是否正常结束,没有正常结束的话,则表示找到了
- 使用printf("%05d", q) 这种格式进行输出
#include <bits/stdc++.h>
using namespace std;
const int maxn=100020;
struct NODE{
char data;
int next;
bool flag;
}node[maxn];
int main(){
int s1,s2,n;
cin>>s1>>s2>>n;
for(int i=0;i<maxn;i++){
node[i].flag=false;
}
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;
}
for(p=s2;p!=-1;p=node[p].next){
if(node[p].flag)break;
}
if(p!=-1){
printf("%05d\n",p);
}else printf("-1\n");
return 0;
}
小模板:
-
定义:
struct node{
int address;
int next;
typename data;
XXXX;//类似flag的标记
} -
一定要进行XXXX的初始化,然后进行遍历标记
-
排序,把有效的点放在前面,区别出来(sort函数用起来,要注意cmp)