[PAT-A 1032]Sharing

[PAT-A 1032]Sharing_第1张图片
[PAT-A 1032]Sharing_第2张图片

考察链表的操作

题目大意:
给出两条链表的首地址以及若干个节点的地址,数据,下一个节点的地址,求两条链表首个公用节点的地址
如果没有 输出-1

思路:
1.定义静态链表,在节点中设置一个int型变量flag,表示节点是否在第一条链表中出现,若出现,则flag为1,若未出现,则flag为-1。
2.由题目给出的第一条链表的首地址出发遍历第一条链表,将经过的所有节点的flag值赋为1
3.每集第二条链表,若出现第一个flag值为1的节点,说明是第一条链表中出现过的节点,即为两条链表的第一个公用节点
4.如果第二条链表枚举完没有发现公用节点,则输出-1.

AC代码:

#include
#include
#include
using namespace std;
const int maxn = 100010;
struct NODE {
	char data;
	int next;
	bool flag;
}node[maxn];
int main() {
	for (int i = 0; i < maxn; i++) {
		node[i].flag = false;
	}
	int s1, s2, n;
	(void)scanf("%d %d %d", &s1, &s2, &n);
	int address, next;
	char data;
	for (int i = 0; i < n; i++) {
		(void)scanf("%d %c %d", &address, &data, &next);
		node[address].data = data;
		node[address].next = next;
	}
	int p;
	for (p = s1; p != -1; p = node[p].next) {
		node[p].flag = true;
	}
	for (p = s2; p != -1; p = node[p].next) {
		if (node[p].flag == true)break;
	}
	if (p != -1) printf("%05d", p);
	else printf("-1\n");
	return 0;
}

你可能感兴趣的:(PAT-A)