- 就这道题而言,有个比较取巧的方法,本题简化了链表的构造过程,直接按照链表的结构给出了每一个结点的next指针,如果说两个单词有共同后缀的话,那么在m行的输入里面必然有2行的最后一位整数是一模一样的(比如测试样例里面的D和e两节点,next都是67890的i),直接用个hash数组存next出现了几次,最后输出大于1次(等于2次)的数组下标即可。
- 严谨的算法思想来讲,构造好链表后,我们的目的是使两链表的尾部对齐,那么先求出两个链表的长度m和n,如果m>n(反之类似),那么就让长链表的指针先向前走m-n个节点,之后让长短链表的指针共同前进,直到它们指向同一节点,则该节点就是他们的共同后缀的第一个字母节点。(快慢指针的思想)
#include<stdio.h>
int main()
{
int s1,s2,n;
while(scanf("%d%d%d",&s1,&s2,&n) != EOF)
{
int hash[100000] = {0};
int flag = 0;
for(int i = 0;i<n;i++)
{
int start,next;
char c;
scanf("%d %c %d",&start,&c,&next);
if(next!=-1)
hash[next] ++;
}
for(int i = 0;i<100000;i++)
{
if(hash[i]>1)
{
printf("%05d\n",i);
flag = 1;
break;
}
}
if(!flag) printf("-1\n");
}
}