题目来源:http://ac.jobdu.com/problem.php?pid=1505
-
题目描述:
-
输入两个链表,找出它们的第一个公共结点。
-
输入:
-
输入可能包含多个测试样例。
对于每个测试案例,输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的两个链表的元素的个数。
接下来的两行,第一行为第一个链表的所有元素,中间用空格隔开。第二行为第二个链表的所有元素,中间用空格隔开。
-
输出:
-
对应每个测试案例,
输出两个链表的第一个公共结点的值。
如果两个链表没有公共结点,则输出“My God”。
-
样例输入:
-
5 4 1 2 3 6 7 4 5 6 7 3 3 1 5 7 2 4 7 2 3 1 3 4 5 6
-
样例输出:
-
6 7 My God
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct LinkNode
{
int iData;
LinkNode* pNext;
LinkNode()
{
iData = 0;
pNext = NULL;
}
};
int GetLinkListLength(LinkNode* pHead)
{
LinkNode* pNode = pHead;
int Len = 0;
while(pNode != NULL)
{
++Len;
pNode = pNode->pNext;
}
return Len;
}
void GetFirstCommonNode(LinkNode* pHead1, LinkNode* pHead2)
{
int iLen1 = GetLinkListLength(pHead1);
int iLen2 = GetLinkListLength(pHead2);
int iDis = iLen1 - iLen2;
LinkNode* pLongLinkHead = pHead1;
LinkNode* pShortLinkHead = pHead2;
if(iLen1 < iLen2)
{
pLongLinkHead = pHead2;
pShortLinkHead = pHead1;
iDis = iLen2 - iLen1;
}
for(int i = 0; i < iDis; ++i)
pLongLinkHead = pLongLinkHead->pNext;
while(pLongLinkHead != NULL && pShortLinkHead != NULL && pLongLinkHead->iData != pShortLinkHead->iData)
{
pLongLinkHead = pLongLinkHead->pNext;
pShortLinkHead = pShortLinkHead->pNext;
}
if(pLongLinkHead != NULL && pShortLinkHead != NULL)
{
printf("%d\n", pLongLinkHead->iData);
}
else
printf("My God\n");
}
void Delete_LinkList(LinkNode* pHead)
{
LinkNode* p1 = pHead;
LinkNode* p2 = NULL;
while(p1 != NULL)
{
p2 = p1->pNext;
delete p1;
p1 = p2;
}
}
int main()
{
LinkNode* pHead1;
LinkNode* pHead2;
int n, m, iElem, i;
while(~scanf("%d %d", &n, &m))
{
if(n < 1 || m < 1)
{
printf("My God\n");
continue ;
}
pHead1 = new LinkNode();
scanf("%d", &iElem);
pHead1->iData = iElem;
LinkNode* p1 = pHead1;
LinkNode* pNode = NULL;
for(i = 1; i < n; ++i)
{
scanf("%d", &iElem);
pNode = new LinkNode();
pNode->iData = iElem;
p1->pNext = pNode;
p1 = pNode;
}
scanf("%d", &iElem);
pHead2 = new LinkNode();
pHead2->iData = iElem;
LinkNode* p2 = pHead2;
pNode = NULL;
for(i = 1; i < m; ++i)
{
pNode = new LinkNode();
scanf("%d", &iElem);
pNode->iData = iElem;
p2->pNext = pNode;
p2 = pNode;
}
if(pHead1->iData == pHead2->iData)
printf("%d\n", pHead1->iData);
else
GetFirstCommonNode(pHead1, pHead2);
Delete_LinkList(pHead1);
Delete_LinkList(pHead2);
}
return 0;
}