1032 Sharing

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);
    }
}

反思和总结

  1. 如何遍历链表?
    for(int p=begin1;p!=-1;p=node[p].next){ //begin为首结点的地址

    }

  2. 结点的结构和赋值方式?
    struct Node{
    int address;//该结点地址
    char data;//数据
    int next;//下一个结点的地址
    bool flag;//表示该结点是否在第一条链表上
    }node[maxn];
    node[a]={a,b,c,false};//flag全部初始化为false,表示所有结点均不在第一条链表上

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值