您的位置:首页 > 其它

九度 题目1505:两个链表的第一个公共结点

2014-05-25 11:53 369 查看
题目来源:http://ac.jobdu.com/problem.php?pid=1505

时间限制:1 秒

内存限制:128 兆

特殊判题:否

提交:595

解决:175

题目描述:

输入两个链表,找出它们的第一个公共结点。

输入:

输入可能包含多个测试样例。

对于每个测试案例,输入的第一行为两个整数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


这个题有问题,交代不明,也许问面试官之后才能做恰当的选择,就单单这个题的话,两个链表尾部并齐,以最短的链表的头结点开始匹配,否则会wa!

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: