当前位置:网站首页>PAT_甲级_1032 Sharing

PAT_甲级_1032 Sharing

2020-11-10 11:25:02 乔梓鑫

题目大意:

给定两条链表的首地址和若干结点地址、数据、下一个结点的地址,求两条链表的公共节点地址,如果没有输出-1。

算法思路:

由于之前在考408做过做过题,所以思路用的就是王道书上讲的(过了好久还记得,$ε=(′ο`*)))$唉),我们使用$node$数组存储所有输入的节点,使用$word1$存储第一个单词组成的链表,$word2$存储第二个单词组成的链表。我们首先遍历$node$数组,获取$word1$链表和其长度$lengthOfWord1$,$word2$链表和其长度$lengthOfWord2$.然后让长度更长的链表的头指针先向前走$|lengthOfWord1-lengthOfWord2|$步,然后再让$word1$和$word2$的工作指针同时向后走,在指针相遇的时候就退出循环,如果当前指针的地址为-1,则输出-1,否则保留5位数输出地址。

注意点:

1、地址得保留5位输出。
2、输入的时候得加空格,因为%c可以接受空格。

提交结果:

image.png

AC代码:

#include <cstdio>

using namespace std;

struct Node{
    int address;
    char data;
    int next;
}node[100005],word1[100005],word2[100005];

int main(){
    int begin_word1,begin_word2,N;
    scanf("%d %d %d",&begin_word1,&begin_word2,&N);
    Node p{};
    for (int i = 0; i < N; ++i) {
        scanf("%d %c %d",&p.address,&p.data,&p.next);
        node[p.address] = p;
    }
    int lengthOfWord1=0,lengthOfWord2=0;
    for (int address=begin_word1;address!=-1;address=node[address].next) {
        p.address = node[address].address;
        p.data = node[address].data;
        p.next = node[address].next;
        word1[p.address] = p;
        ++lengthOfWord1;
    }
    for (int address=begin_word2;address!=-1;address=node[address].next) {
        p.address = node[address].address;
        p.data = node[address].data;
        p.next = node[address].next;
        word2[p.address] = p;
        ++lengthOfWord2;
    }
    if(lengthOfWord1>lengthOfWord2){
        // begin_word1先走lengthOfWord1-lengthOfWord2步
        for (int i = 0; i < lengthOfWord1 - lengthOfWord2; ++i) {
            begin_word1 = word1[begin_word1].next;
        }
    } else {
        // begin_word2先走lengthOfWord2-lengthOfWord1步
        for (int i = 0; i < lengthOfWord2 - lengthOfWord1; ++i) {
            begin_word2 = word2[begin_word2].next;
        }
    }
    // 然后两者同时前进,相遇的时候要么是共同的节点,要么是-1
    while (begin_word1!=begin_word2){
        begin_word1 = word1[begin_word1].next;
        begin_word2 = word2[begin_word2].next;
    }
    if(begin_word1==-1){
        printf("-1");
    } else {
        printf("%05d",begin_word1);
    }
    return 0;
}

版权声明
本文为[乔梓鑫]所创,转载请带上原文链接,感谢
https://segmentfault.com/a/1190000037782536