静态链表
//求两个链表的首个共用结点
#include<cstring>
#include<iostream>
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;
scanf("%d%d%d", &s1, &s2, &n);//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 p;
for(p = s1; p != -1; p = node[p].next){
node[p].flag = true;//枚举第一条链表的所有结点,令其出现次数为1
}
for(p = s2; p != -1; p = node[p].next){
if(node[p].flag == true) break;
}
if(p != -1){
printf("%05d\n", p);//找到公共结点
}else{
printf("-1\n");
}
return 0;
}
静态链表的解题步骤
#include<iostream>
#include<algorithm>
using namespace std;
//1,定义静态链表
const int maxn = 100010;
struct NODE{
int address, data, next;
bool flag;
}node[maxn];
bool cmp(NODE a, NODE b){
if(a.flag == false|| b.flag == false){
a.flag > b.flag;//无效结点直接放在后面
}else{
return a.data < b.data;//都为true则从小到达排序
}
}
int main(){
//2,初始化,建表
for(int i = 0; i < maxn; i++){
node[i].flag = false;
}
int n, address, bign;
scanf("%d%d", &n, &begin);
for(int i = 0; i < n; i++){
scanf("%d", %address);
scanf("%d%d", %node[address].data, &node[address].next);
node[address].address = address;
}
int count = 0, p = begin;
//3,枚举链表,
while(p != -1){
node[p].flag = true;//表示node在链表内
count++;
p = node[p].next;
}
if(count == 0){//特判,新链表中没有结点时输出0, -1;
printf("0 -1");
}else{
//4,筛选有效结点,并按data从小到大排序
sort(node, node + maxn, cmp);
//5,输出结果
//防止-1被%05d化,提前判断
printf("%d %d\n", count, node[0].address);
for(int i = 0; i < count, i++){
if(i != count - 1){
printf("%05d %d %05d\n", node[i].address, node[i].data, node[i].next)
}else{
printf("%05d %d -1\n", node[i].address, node[i].data);
}
}
}
}