PAT A1032 Sharing (25 分) 链表

    题目大意:给出两个链表的头节点地址,和N个节点,判断从哪个节点开始,两个链表重合。

    先用vector 存储两个完整的链表,然后从两个链表的最后向前遍历,直到两个元素不相同。需要考虑的特殊情况有两个:①某个链表是另外一个链表的一部分,这样退出循环时的下标也是0。②某个链表为空,这样会造成下标越界。可以在这两个vector的开头另外分别加上一个不相同的元素,这样,保证在遍历到下标为0之前可以退出循环,并且不会下标越界。

AC代码如下:

#include 
#include 

using namespace std;

int list[100010] = {0};

int main()
{
    int s1, s2, N;
    scanf("%d%d%d", &s1, &s2, &N);
    for (int i = 0; i < N; ++i)
    {
        int address, next;
        char data;
        scanf("%d %c %d", &address, &data, &next);
        list[address] = next;
    }
    vector v1, v2;
    v1.push_back(1);
    v2.push_back(-1);
    for (int p = s1; p != -1; p = list[p])
    {
        v1.push_back(p);
    }
    for (int p = s2; p != -1; p = list[p])
    {
        v2.push_back(p);
    }
    int i = v1.size() - 1, j = v2.size() - 1;
    while(i > 0 && j > 0 && v1[i] == v2[j])
    {
        if(v1[i-1] != v2[j-1]) break;
        i--;
        j--;
    }
    if(v1[i] == v2[j]) printf("%05d", v1[i]);
    else printf("-1");
    return 0;
}


 

你可能感兴趣的:(PAT,Review)