题目难度:一颗半星
题目大意:就是两个链表,需要找出最开始的公共节点。
题目坑点:这道题又颠覆了我之前的认知,就是关于cin和scanf的东西,之前我都是用cin超时,然后用scanf不超时,但是这次就不一样了,用scanf反而超时。。。郁闷,希望可以有大佬指点一下,区别在哪儿,为啥我这里用scanf就会超时。
刚开始用了初试里面王道上面的那个解题的方法,但是一个测试点超时,然后换了一个思路,就ac了。
代码如下:
#include<iostream>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<algorithm>
#include<map>
#include<set>
#include<cstring>
using namespace std;
typedef struct{
char data;
int next;
}Node;
Node list[101000];
int main(){
int as,bs,num,loc;
cin>>as>>bs>>num;
for(int i=0;i<num;i++){
cin>>loc;
cin>>list[loc].data>>list[loc].next;
// scanf("%d",&loc); 这会儿用scanf反而超时。
// scanf("%c %d",&list[loc].data,&list[loc].next);
}
set<int> s;
while(as!=-1){
s.insert(as);
as=list[as].next;
}
int flag=0;
while(bs!=-1){
if(s.find(bs)!=s.end()){
flag=1;
break;
}
else{
bs=list[bs].next;
}
}
if(flag==1){
printf("%05d",bs);
}
else{
printf("-1");
}
}
/*
int getLen(int s){
int len=1;
while(list[s].next!=-1){
len++;
s=list[s].next;
}
return len;
}
int len1=getLen(as),len2=getLen(bs);
if(len1>len2){
for(int i=0;i<len1-len2;i++){
as=list[as].next;
}
}
else{
for(int i=0;i<len2-len1;i++){
bs=list[bs].next;
}
}
while(as!=bs&&as!=-1){
as=list[as].next;bs=list[bs].next;
}
if(as!=-1){
printf("%05d",as);
}
else{
printf("-1");
}
*/
来源:CSDN
作者:weixin_42302528
链接:https://blog.csdn.net/weixin_42302528/article/details/104610669