PAT甲级-1032 Sharing

题目

题目大意

有两个字母链表分别表示两个单词,给出这两个链表的起始位置和总节点数,要求求出两个单词相同后缀的起始地址。如果没有相同后缀,就输出-1。

思路

相同后缀就是两条链表的重合位置,后缀的起始地址就是重合位置的第一个地址。标记第一条链表,将第一条链表和第二条链表区分开。遍历第二条链表中的某个节点,发现其已在第一条链表中,由于链表的特性,接下来的节点一定会重合,则该节点即为后缀起始位置。

可以用结构体数组表示链表,节点地址即为下标,每个节点存储当前节点的值和下一个节点的地址,再加一个标志位flag,判断是否在第一条链表中。

注意结构化输出%05d。

代码

#include <iostream>
using namespace std;

struct node{
    char data;  // 当前节点表示的值
    int next;  // 下一个节点的地址
    bool flag;  // 是否位于第一个链表中
}v[100000];
int s1, s2, n;

int main(){
    cin >> s1 >> s2 >> n;
    for (int i = 0; i < n; i++){
        int ads;
        cin >> ads;
        cin >> v[ads].data >> v[ads].next;
        v[ads].flag = false;
    }

    for (int i = s1; i != -1; i = v[i].next){
        v[i].flag = true;
    }  // 标记第一条链表中的节点
    for (int i = s2; i != -1; i = v[i].next){
        if (v[i].flag){
            printf("%05d", i);  // 测试点4,没有补0就会错
            return 0;
        }  // 遍历第二条链表,第一个在第一条链表中的节点地址即为后缀的起始位置
    }
    cout << "-1" << endl;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_74092648/article/details/143330709