1. 程式人生 > >九度OJ-題目1468-Sharing-連結串列

九度OJ-題目1468-Sharing-連結串列

題目描述:

To store English words, one method is to use linked lists and store a word letter by letter. To save some space, we may let the words share the same sublist if they share the same suffix. For example, “loading” and “being” are stored as showed in Figure 1.
這裡寫圖片描述
Figure 1
You are supposed to find the starting position of the common suffix (e.g. the position of “i” in Figure 1).

輸入:

For each case, the first line contains two addresses of nodes and a positive N (<= 10^5), where the two addresses are the addresses of the first nodes of the two words, and N is the total number of nodes. The address of a node is a 5-digit positive integer, and NULL is represented by -1.
Then N lines follow, each describes a node in the format:
Address Data Next
where Address is the position of the node, Data is the letter contained by this node which is an English letter chosen from {a-z, A-Z}, and Next is the position of the next node.

輸出:

For each case, simply output the 5-digit starting position of the common suffix. If the two words have no common suffix, output “-1” instead.

樣例輸入:

11111 22222 9
67890 i 00002
00010 a 12345
00003 g -1
12345 D 67890
00002 n 00003
22222 B 23456
11111 L 00001
23456 e 67890
00001 o 00010
00001 00002 4
00001 a 10001
10001 s -1
00002 a 10002
10002 t -1
樣例輸出:
67890
-1

來源:

2012年浙江大學計算機及軟體工程研究生機試真題

思路:

思路:
題目要求輸出兩個連結串列的第一個交叉的字元的地址,我們可以不用搞連結串列的結構,直接把出現在第一個連結串列的字元標記出來(不需要真的搞個連結串列),然後遍歷第二個連結串列,如果第二個字串中的字元在第一個連結串列中出現了,就直接輸出。否則,輸出-1。

#include<bits/stdc++.h>
#define maxn  100001
using namespace std;


int rnode[maxn];
int node[maxn];
int main(){

    int s1,s2,n,t1,t2;

    while(~scanf("%d %d %d",&s1,&s2,&n)){
        memset(node,0,sizeof(node));
        memset(rnode,0,sizeof(rnode));
        int t1,t2;
        char c;
        for(int i = 0;i < n;i++){
            scanf("%d %c %d",&t1,&c,&t2);
            node[t1] = t2;
        }   
        while(s1 != -1){
            rnode[s1] = 1;//標記第一個連結串列中出現的字元 
            s1 = node[s1];
        }
        bool find = false;
        while(s2 != -1){
            if(rnode[s2] == 1){
                printf("%.5d\n",s2);//如果不加這個.就會輸出"    0"而不是"00000" 
                find = true;
                break;
            }else{
                s2 = node[s2];
            }
        }
        if(!find){
            printf("-1\n");
        }
    }
    return 0;
}