1032 Sharing (25分)

题意

给出两条链表的首地址以及若干结点的地址、数据、下一个结点的地址,求两条链表的首个共用结点的地址。如果两条链表没有共用结点,则输出-1。

思路

  1. 由于地址的范围很小,因此可以直接用静态链表,但是依照题目的要求,在结点的结构体中再定义一个bool型变量visited,表示结点是否在第一条链表中出现,是则为true。
  2. 由题目给出的第一条链表的首地址出发遍历第一条链表, 将经过的所有结点的visited值赋为true。
  3. 接下来枚举第二条链表,当出现第一个visited值为true的结点,说明是第一条链表中出现过的结果,即为两条链表的第一个共用结点。
  4. 如果第二条链表枚举完仍然没有发现共用结点,则输出-1。

注意点

  1. 使用%05d格式输出地址,可以使不足5位的整数的高位补0。
  2. scanf使用%c格式时是可以读入空格的,因此在输入地址、数据及后继结点地址时,格式不能写成%d%c%d,必须在中间加空格。
const int N=1e5+10;
struct Node {
    char data;
    int nxt;
    bool visited;
}a[N];
int head1,head2;
int n;

int main()
{
    cin>>head1>>head2;
    cin>>n;

    for(int i=0;i<n;i++)
    {
        int addr,nxt;
        char data;
        cin>>addr>>data>>nxt;
        a[addr]={data,nxt};
    }

    int p1 = head1;
    while(p1 != -1)
    {
        a[p1].visited = true;
        p1 = a[p1].nxt;
    }

    int p2 = head2;
    int ans=-1;
    while(p2 != -1)
    {
        if(a[p2].visited)
        {
            ans = p2;
            break;
        }
        p2 = a[p2].nxt;
    }

    if(~ans) printf("%05d\n",ans);
    else puts("-1");
    //system("pause");
    return 0;
}
posted @ 2021-01-31 16:56  Dazzling!  阅读(37)  评论(0编辑  收藏  举报