/************************************************************************
**题目:输入两个链表,找出它们的第一个公共结点。
方法:在较长的链表上先走几步,再同时遍历找公共结点
**************************************************************************/
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};//链表的结点定义
ListNode* FindFirstCommonNode (ListNode *pHead1, ListNode *pHead2)
{
unsigned int nLength1 = GetListLength(pHead1);
unsigned int nLength2 = GetListLength(pHead2);
int nLengthDif = nLength1 - nLength2;
ListNode* pListHeadLong = pHead1;
ListNode* pListHeadShort = pHead2;
if(nLength2 > nLength1)
{
pListHeadLong = pHead2;
pListHeadShort = pHead1;
nLengthDif = nLength2 -nLength1;
}
for(int i = 0; i < nLengthDif; ++i)
pListHeadLong = pListHeadLong ->m_pNext;
while((pListHeadLong != NULL) &&(pListHeadShort != NULL) && (pListHeadLong != pListHeadShort))
{
pListHeadLong = pListHeadLong ->m_pNext;
pListHeadShort = pListHeadShort ->m_pNext;
}
ListNode* pFirstCommonNode = pListHeadLong;
return pFirstCommonNode;
}
unsigned int GetListLength(ListNode* pHead)
{
unsigned int nLength = 0;
ListNode* pNode = pHead;
while(pNode != NULL)
{
++nLength;
pNode = pNode->m_pNext;
}
return nLength;
}