【题意】
第二种方法
给出两个链表形式存储的字符串的内存地址及其内容,找出它们共享后缀的起始地址,找不到就返回-1
【思路】
一开始我采用的方法是计算出两个字符串的长,长的字符串先往后读长度差个字符,然后两个字符串同时往后读直到找到相同地址,但这个方法会在最后一个case超时(而且倒数第二个点是答案错误,不知道错在哪,可能写得不太严谨);于是看了看了网上别人的解题报告,发现可以先扫描一遍第一个字符串,将过程中的点进行标记,再扫描第二个字符串,碰到标记过的就输出结果,到最后都没找到标记过的点就输出-1即可,这种方法比我一开始采用的方法更快一些,顺利AC。
一开始的方法,没AC
#include <iostream>
#include <string>
#include <vector>
#include <cstdio>
using namespace std;
typedef struct{
int addr;
char ch;
int next;
}node;
int main(int argc, char const *argv[])
{
int start[2],totalNum,len[2];
vector<node> input,word[2];
node tmp;
cin >> start[0] >> start[1] >> totalNum;
for(int i=0; i<totalNum; i++){
scanf("%d %c %d", &tmp.addr, &tmp.ch, &tmp.next);
input.push_back(tmp);
}
for(int i=0; i<2; i++){
int next = start[i];
if(start[i]==-1){
cout << -1;
system("pause");
return 0;
}
while(next!=-1){
for(vector<node>::iterator it=input.begin(); it!=input.end(); it++){
if((*it).addr==next){
word[i].push_back(*it);
next = (*it).next;
break;
}
}
}
len[i] = word[i].size();
}
int index[2]={0,0};
if(len[0]>len[1]){
index[0] += len[0]-len[1];
}
else{
index[1] += len[1]-len[0];
}
while(index[0]<len[0]-1 && word[0][index[0]].next!=word[1][index[1]].next){
index[0]++;
index[1]++;
}
if(word[0][index[0]].next>0){
printf("%05d", word[0][index[0]].next);
}
else{
cout << -1;
}
system("pause");
return 0;
}
第二种方法
#include <iostream>
#include <string>
#include <cstdio>
#include <map>
using namespace std;
int main(int argc, char const *argv[])
{
int start[2],totalNum,len[2];
map<int,pair<int,bool>> input;
cin >> start[0] >> start[1] >> totalNum;
for(int i=0; i<totalNum; i++){
int addr;
char ch;
pair<int,bool> tmp;
scanf("%d %c %d", &addr, &ch, &tmp.first);
tmp.second = false;
input[addr] = tmp;
}
for(int i=0; i<2; i++){
int next = start[i];
while(next!=-1){
if(i==0){
input[next].second = true;
}
else if(input[next].second){
printf("%05d", next);
system("pause");
return 0;
}
next = input[next].first;
}
}
cout << -1;
system("pause");
return 0;
}