PAT A1032 Sharing (25 分) 链表

60 篇文章 0 订阅

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

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

AC代码如下:

#include <vector>
#include <cstdio>

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<int> 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;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值