题目大意:
给定两条链表的首地址和若干结点地址、数据、下一个结点的地址,求两条链表的公共节点地址,如果没有输出-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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。