问题描述】给定两个单链表,编写算法找出两个链表的公共结点
【输入形式】用于构造两个公共链表的结点数和数据元素的值
【输出形式】两个单链表所有公共结点的元素值以空格间隔输出
【样例输入】若构建的两个链表结构如下图所示:则公共结点为数据值为11和15的结点。
【样例输出】11 15
【样例说明】
【评分标准】
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
struct LNode
{
int data;
LNode *next;
};
typedef LNode *Linklist;
// 尾插入法创建链表,创建n个节点
void create(Linklist &h, int n)
{
LNode *r, *p;
h = new LNode;
h->next = NULL;
r = h;
for (int i = 1; i <= n; i++)
{
p = new LNode;
cin >> p->data;
r->next = p;
r = p;
}
r->next = NULL;
}
// 随机创建链表,创建m个节点
void create(Linklist &h)
{
LNode *r, *p;
srand(time(NULL));
int i, m;
m = rand() % 10;
h = new LNode;
h->next = NULL;
r = h;
for (int i = 1; i <= m; i++)
{
p = new LNode;
p->data = rand() % 90 + 10;
r->next = p;
r = p;
}
r->next = NULL;
}
// 获取链表的尾节点
LNode *getTail(Linklist h)
{
LNode *tail;
tail = h;
while (tail->next)
{
tail = tail->next;
}
return tail;
}
// 连接链表ha和链表hb
void connect(Linklist ha, Linklist hb)
{
LNode *r;
r = getTail(ha);
r->next = hb->next;
}
// 打印链表的数据
void printList(Linklist h)
{
LNode *p = h->next;
while (p)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
// 打印两个链表的公共节点
void printPublicNode(Linklist ha, Linklist hb)
{
LNode *pa = ha->next;
while (pa)
{
LNode *pb = hb->next;
while (pb)
{
if (pa == pb) // 判断是否为公共节点
{
cout << pa->data << " "; // 打印公共节点的数据
break;
}
pb = pb->next;
}
pa = pa->next;
}
cout << endl;
}
int main()
{
Linklist ha, hb, hc;
int n;
cin >> n;
create(ha); // 随机创建链表ha
create(hb); // 随机创建链表hb
create(hc, n); // 创建链表hc,输入n个节点的数据
connect(ha, hc); // 将链表hc连接到链表ha的尾部
connect(hb, hc); // 将链表hc连接到链表hb的尾部
printPublicNode(ha, hb); // 打印两个链表的公共节点
return 0;
}