- 就这道题而言,有个比较取巧的方法,本题简化了链表的构造过程,直接按照链表的结构给出了每一个结点的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"); } }