1032 Sharing (25 分)

1032 Sharing (25 分)

题意

给出两个用链表存储的字符串(每个节点存储一个字母)即给出一系列无序的节点,请你找出两个字符串第一个相同节点的地址,如果没有输出-1.

思路

大致同1074 Reversing Linked List (25 分)
建立一个标记数组,下标代表节点地址。初始化标记为零,给在每个链表的节点加一个标记。如在第一个链表,标记加1,在第二个链表标记又加1,标记为2的即为两个链表公共的节点。
建立两个链表分别表示连个字符串,对两个链表分别进行操作。由于只需找出两个字符串第一个相同节点的地址,给节点添加标记后对其中任意一个字符遍历找出第一个标记为2的节点即可。

代码

#include<stdio.h>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
typedef struct node{
	int address,next,order,data;
}node;
bool cmp(node a,node b)
{
	return a.order<b.order;
}
node link1[100007],link2[100007];
int vis[100007][2];
int main()
{
	for(int i=0;i<100001;i++){
		link1[i].order=inf;
		link2[i].order=inf;
		vis[i][0]=0;
	}
	int begin1,begin2,n,address,next,cnt,flag=0;
	char ch;
	scanf("%d%d%d",&begin1,&begin2,&n);
	for(int i=0;i<n;i++){
		scanf("%d",&address);
		getchar();
		scanf("%c",&ch);
		link2[address].data=link1[address].data=ch-'A';
		scanf("%d",&next);
		link1[address].next=link2[address].next=next;
		link1[address].address=link2[address].address=address;
	}
//	printf("####\n");
	next=begin1;
	cnt=0;
	while(next!=-1){
		link1[next].order=cnt++;
		vis[link1[next].address][0]++;
//		printf("@@@%05d %c %05d\n",link1[next].address,link1[next].data+'A',link1[next].next);
		next=link1[next].next;
	}
//	printf("$$$$$$$\n");
	next=begin2;
	while(next!=-1){
		link2[next].order=cnt++;
		vis[link2[next].address][0]++;
		next=link2[next].next;
	}
	sort(link1,link1+100001,cmp);	//注意是对整个数组排序
	for(int i=0;i<cnt;i++){
//		printf("@@@##%05d %c %05d\n",link1[i].address,link1[i].data+'A',link1[i].next);
		if(vis[link1[i].address][0]==2){
			printf("%05d\n",link1[i].address);
			flag=1;
			break;
		}
	}
	if(!flag){
		printf("-1\n");
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值