PAT A1032 Sharing

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-03 08:31:25

题目难度:一颗半星
题目大意:就是两个链表,需要找出最开始的公共节点。
题目坑点:这道题又颠覆了我之前的认知,就是关于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");
	}
*/	
	
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!