其他分享
首页 > 其他分享> > PAT A1032 Sharing

PAT A1032 Sharing

作者:互联网

题意:给出两条链表的首地址以及若干节点的地址,数据,下一个节点的地址,求两条链表的首个共用节点的地址。如果两条链表没有共用节点,则输出-1。
思路
步骤1:由于地址的范围很小,因此可以直接用静态链表,但是依照题目的要求,在结
点的结构体中再定义一个int型变量flag,表示结点是否在第一条链表中出现,是则为l,不
是为 - 1。
步骤2:由题目给出的第一条链表的首地址出发遍历第一条链表,将经过的所有结点的
flag值赋为1.
接下来枚举第二条链表,当出现第一个fag值为1的结点,说明是第一条链表中出现过
的结果,即为两条链表的第一个共用结点。
如果第二条链表枚举完仍然没有发现共用结点,则输出 - 1。
注意点
①使用 % 05d格式输出地址,可以使不足5位的整数的高位补0
②使用map容易超时。
seanf使用 % c格式时是可以读入空格的,因此在输入地址、数据、后继结点地址的(注释:前面有空格,表示读一字符前要跳过 前面 所有 的空白字符(空格,表格键,回车换行键等,有多少跳多少)后才读入1个实质性的 (字母数字符号)字符)
格式不能写成 % d % c % d,必须在中间加空格。
输入样例
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
输出样例
67890

#include<cstdio>
#include<cstring>
const int maxn = 100010;
struct Node {
    char data;
    int next;
    bool flag;
}node[maxn];
int main() {
    int s1, s2, n;
    scanf("%d%d%d", &s1, &s2, &n);
    int address,next;
    char data;
    for (int i = 0; i < n; i++) {
        scanf("%d %c %d", &address, &data, &next);
        node[address].data = data;
        node[address].next = next;
    }
    int x;
    for (x = s1; x != -1;x=node[x].next) {
        node[x].flag = true;
    }
    for (x = s2; x != -1; x = node[x].next) {
        if (node[x].flag == true) {
            break;
        }
    }
    if (x != -1) {
        printf("%05d", x);
    }
    else {
        printf("-1");
    }
    return 0;
}

 

标签:node,结点,Sharing,PAT,int,next,链表,地址,A1032
来源: https://www.cnblogs.com/migang/p/14671778.html