PAT 1032. Sharing

这道题有两种思路,一种是先遍历两个链表,得到长度len1,len2,然后得到长度之差(len2-len1),把较长的链表移动(len2-len1)个节点,那么两个列表剩下的长度就一样了。那么遇到的第一对相同的节点就是共同节点。

另一种思路更简单,先遍历一个链表,并且为这个链表的每一项添加一个flag(可以用数组记录)。在遍历另一个链表,只要遍历的某个节点出现了flag,这个节点就是公共节点。

代码是实现的第二个思路。用python和java最后一个case均超时,只好请出万能的c++:

#include <iostream>
#include <stdio.h>
int dic[100000];
int is[100000];
int main()
{
    int adrA,adrB,N;
    scanf("%d %d %d",&adrA,&adrB,&N);

    for(int i=0;i<N;i++)
    {
            int a,b;
            char str[2];
            scanf("%d %s %d",&a,str,&b);
            dic[a]=b;
            is[a]=false;
    }
    int cur=adrA;
    while(cur!=-1)
    {
            is[cur]=true;
            cur=dic[cur];
    }
    cur=adrB;
	while(cur!=-1)
	{
		if(is[cur])
		{
			printf("%05d\n",cur);
			return 0;
		}
		cur=dic[cur];
	}
	printf("-1\n");
    return 0;    
}
python:
line=raw_input().split()
(adrA,adrB,N)=(int(line[0]),int(line[1]),int(line[2]))
dic={}
for i in range(N):
    line=raw_input().split()
    dic[int(line[0])]=[int(line[2]),0]
cur=adrA
while(cur!=-1):
    dic[cur][1]=1
    cur=dic[cur][0]
cur=adrB
while(cur!=-1):
    if(dic[cur][1]==1):
        print '%05d'%(cur)
        exit(0)
    cur=dic[cur][0]
print -1
java:
import java.util.Scanner;

public class PAT1032 {
	public static void main(String args[])
	{
		Scanner s=new Scanner(System.in);
		int adrA=s.nextInt();
		int adrB=s.nextInt();
		int N=s.nextInt();
		int[] dic=new int[100002];
		boolean[] is=new boolean[100002];
		for(int i=0;i<N;i++)
		{
			int a=s.nextInt();
			s.next();
			dic[a]=s.nextInt();
			is[a]=false;
		}
		int cur=adrA;
		while(cur!=-1)
		{
			is[cur]=true;
			cur=dic[cur];
		}
		cur=adrB;
		while(cur!=-1)
		{
			if(is[cur])
			{
				System.out.println(String.format("%05d", cur));
				return;
			}
			cur=dic[cur];
		}
		System.out.println(-1);
	}
}


你可能感兴趣的:(PAT 1032. Sharing)