PAT A1032 Sharing

题目的大致叙述如下所示:

简单来说,题目的大致需求就是给出两个链表,其中链表的一部分为共用部分,目的就是找到那个共用部分的第一个结点索引。

自己之前先动手实现了一遍,但是仿佛像一个弱智;当时自己想的反正要对比,就像排序那样对比两个序列,两个链表的元素挨个对比。但是忽略了一个问题,当前面不同链表个数相差个大的时候,总会有一个链表先穷尽,所以不可能找到交汇点。

至于书上和网上的思路是建立节点信息;进行两次遍历,对A链表遍历时打上标签,当进行B链表遍历的时候,如果访问到交汇点,必然会发现打上的标签,所以思路就既清晰又简单。

#include <cstdio>
#include<stdlib.h>
const int maxn = 100010;

//定义链表
struct Node {
    int address, data, next;
    int flag;
} node[maxn];

int main() {
    //初始化
    for(int i = 0; i < maxn; i++)
        node[i].flag = 0;
    //读取数据
    int b1, b2, n;
    int address, next;
    char data;
    scanf("%d %d %d", &b1, &b2, &n);
    for(int i = 0; i < n; i++) {
        scanf("%d %c %d", &address, &data, &next);
        node[address].address = address;
        node[address].data = data;
        node[address].next = next;
    }
    //遍历链表标记特殊性质,此题不需要统计有效结
    for(int i=b1;i!=-1;i=node[i].next){
        node[i].flag=1;
    }
    int flag=-1;
    //此题不需要排序,直接进行第⑤步
    for(int i=b2;i!=-1;i=node[i].next){
        if(node[i].flag==1){
            flag=i;
            break;
        }
    }
    if(flag != -1)
        printf("%05d", flag);
    else
        printf("-1\n", flag);
    system("pause");
    return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值