**题目:输入两个链表,找出他们第一个公共结点。
代码示例:**
#include<iostream>
using namespace std;
struct Node
{
int data;
Node *next;
};
class List
{
Node *head;
public:
List()
{
head = NULL;
}
~List();
void CreateList(int a[], int n);
void Disp(void);
int length(void);
friend bool FirstParent(List &list1, List &list2,int &e);
};
List::~List(void)
{
Node *p = head;
while (p)
{
Node *q = p->next;
delete p;
p = q;
}
}
void List::CreateList(int a[], int n)
{
if (a == NULL || n <= 0)
return;
head = new Node();
head->data = a[0];
Node *current = head;
for (int i = 1; i < n; i++)
{
Node *p = new Node();
p->data = a[i];
current->next = p;
current = p;
}
current->next = NULL;
}
void List::Disp(void)
{
Node *p = head;
while (p)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
int List::length(void)
{
Node *p = head;
int len = 0;
while (p)
{
len++;
p = p->next;
}
return len;
}
bool FirstParent( List &list1, List &list2, int &e)
{
int len1 = list1.length();
int len2 = list2.length();
int lendif;
int len;
Node *P1 = NULL;
Node *P2 = NULL;
if (len1 > len2)
{
lendif = len1 - len2;
len = len2;
P1 = list1.head;
P2 = list2.head;
}
else if (len1 < len2)
{
lendif = len2 - len2;
len = len1;
P1 = list2.head;
P2 = list1.head;
}
else
{
if (list1.head == list2.head)
{
e = list1.head->data;
return true;
}
else
return false;
}
for (int i = 0; i < lendif; i++)
P1 = P1->next;
for (int i = 0; i < len; i++)
{
if (P1 != P2)
{
P1 = P1->next;
P2 = P2->next;
}
else
{
e = P1->data;
return true;
}
}
return false;
}
int main()
{
const int n1 = 7;
const int n2 = 3;
int a1[n1] = { 1,8,6,20,-4,52,8 };
int a2[n2] = { 3,0,5 };
List mylist1, mylist2;
mylist1.CreateList(a1, n1);
mylist2.CreateList(a2, n2);
cout << "链表1:";
mylist1.Disp();
cout << "链表2:";
mylist2.Disp();
//===
int e = -1;
bool flag = FirstParent(mylist1, mylist2,e);
if (flag)
{
cout << "两个链表的第一个公共结点是:" << e << endl;
}
else
{
cout << "两个链表没有公共结点!"<< endl;
}
}