A 1032 Sharing (25 point(s))
用静态链表实现的题目,比较简单。
原题链接
下面给出自己的accept代码。
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int Maxsize = 100010;
class node {
public:
int next;
char data;
node() {
this->data = ' ';
this->next = -1;
}
}Node[Maxsize];
bool HashMap[Maxsize] = { false };
int main() {
int nodeHead1 = 0,nodeHead2, number;
bool flag = false;
int commonSuffix = -1;
cin >> nodeHead1 >> nodeHead2 >> number;
for (int i = 0; i < number; i++) {
int address, next;
char Data;
scanf("%d %c %d", &address, &Data, &next);
Node[address].data = Data;
Node[address].next = next;
}
while (Node[nodeHead1].next != -1) {
HashMap[nodeHead1] = true;
nodeHead1 = Node[nodeHead1].next;
}
while (Node[nodeHead2].next != -1) {
if (!HashMap[nodeHead2]) {
nodeHead2 = Node[nodeHead2].next;
}
else {
commonSuffix = nodeHead2;
break;
}
}
if (commonSuffix == -1)
cout << commonSuffix << endl;
else
printf("%05d\n", commonSuffix);
return 0;
}
主要思路
- 建立一个node类,存放地址和数据。由于题目提到地址都是5位数的,我们可以采用静态链表,开辟一个六位数的node表。
- 建立一个hash表用来记录是否出现过该节点。
- scan函数不能不打空格,即 scanf("%d %c %c"); 不然会输入不成功。
- 对第一个链表进行一次历遍,并把出现情况记录在hash表里。
- 第二次历遍则开始校对hash表,直到出现发现第一个共用节点后跳出。(这里我认为是应该历遍到最后一个节点……毕竟是后缀。但是书上和网上各位的代码都是没有历遍到最后的,并且的确能ac……嗯我也不知道该怎么说服自己)
- 输出时记得,可以采用printf("%05d",commonSuffix); 补零,零是不能缺的。但输出-1时不用补零,所以需要做一次判断。
- 记得初始化node类,不然有可能会出现点4超时的情况 (超时大概是因为当头指针会为负,或者可以试试特判头指针为负的情况)