1. 就这道题而言,有个比较取巧的方法,本题简化了链表的构造过程,直接按照链表的结构给出了每一个结点的next指针,如果说两个单词有共同后缀的话,那么在m行的输入里面必然有2行的最后一位整数是一模一样的(比如测试样例里面的D和e两节点,next都是67890的i),直接用个hash数组存next出现了几次,最后输出大于1次(等于2次)的数组下标即可。
  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");
    }

}