这道题有两种思路,一种是先遍历两个链表,得到长度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 -1java:
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); } }