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

PAT A1032

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

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

至于书上和网上的思路是建立节点信息;进行两次遍历,对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;
}

 

相关文章:

  • 2021-12-16
  • 2022-12-23
  • 2021-07-07
  • 2021-10-30
  • 2021-04-20
  • 2021-04-29
  • 2021-05-01
猜你喜欢
  • 2021-07-13
  • 2022-12-23
  • 2022-01-15
  • 2021-06-09
  • 2022-12-23
  • 2022-01-21
  • 2021-10-11
相关资源
相似解决方案