• 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
    ",ans);
        else puts("-1");
        //system("pause");
        return 0;
    }
    
  • 相关阅读:
    人生转折点:弃文从理
    人生第一站:大三暑假实习僧
    监听器启动顺序和java常见注解
    java常识和好玩的注释
    182. Duplicate Emails (Easy)
    181. Employees Earning More Than Their Managers (Easy)
    180. Consecutive Numbers (Medium)
    178. Rank Scores (Medium)
    177. Nth Highest Salary (Medium)
    176. Second Highest Salary(Easy)
  • 原文地址:https://www.cnblogs.com/fxh0707/p/14353049.html
Copyright © 2020-2023  润新知