1032 Sharing
题目大意
给出两串链表,如果两条链表如果有公共链表,请输出公共链的第一个结点的address;否则输出-1
核心思路
思路借鉴于柳神,链接如下
https://blog.csdn.net/liuchuo/article/details/52144527
用结构体数组存储链表,node[i]表示地址为i的结点,key表示值,next表示下一个结点的地址,flag表示该结点是否在第一条链表上,初始化为false,表示所有结点均不在第一条链表上
遍历第一题链表,将访问到的结点的flag都标记为true
遍历第二条链表,如果遇到了flag为true的结点就把该结点的地址赋值给ans并退出循环
根据ans的值做出相应输出
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=100000;
struct Node{
int address;
char data;
int next;
bool flag;//表示该结点是否在第一条链表上
}node[maxn];
int main(){
//读入两个初始结点的address,结点数量
int begin1,begin2,n;
scanf("%d%d%d",&begin1,&begin2,&n);
//给每个结点赋值
for(int i=0;i<n;i++){
int a,c;
char b;
scanf("%d %c %d",&a,&b,&c);
node[a]={a,b,c,false};//flag全部初始化为false,表示所有结点均不在第一条链表上
}
//遍历第一串链表,在第一串链表上的结点的flag全部改为true
for(int p=begin1;p!=-1;p=node[p].next){
node[p].flag=true;
}
//遍历第二条链表,遇到flag为true的结点,把address赋值给ans并退出循环
int ans=-1;//存储第一个公共结点的address,初始化为-1,表示未找到公共结点
for(int p=begin2;p!=-1;p=node[p].next){
if(node[p].flag==true){//该结点在第二条链表上也出现了
ans=node[p].address;
break;
}
}
//根据ans的值做出相应的输出
if(ans==-1) printf("-1");
else{
printf("%05d",ans);
}
}
反思和总结
-
如何遍历链表?
for(int p=begin1;p!=-1;p=node[p].next){ //begin为首结点的地址}
-
结点的结构和赋值方式?
struct Node{
int address;//该结点地址
char data;//数据
int next;//下一个结点的地址
bool flag;//表示该结点是否在第一条链表上
}node[maxn];
node[a]={a,b,c,false};//flag全部初始化为false,表示所有结点均不在第一条链表上