题目粗心:

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

算法思路:

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

留神点:

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

提交后果:

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