题目:
输入两个链表,找出他们的第一个公告结点。
思路:
长链表先走,然后一起走。
代码:
#include <iostream>
using namespace std;
//功能:输入两个链表,找出他们的第一个公共结点。
struct ListNode
{
int m_nKey;
ListNode *m_pNext;
ListNode(){}
ListNode(int x):m_nKey(x),m_pNext(NULL){}
};
unsigned GetListLength(ListNode *pHead)
{
unsigned int nLength = 0;
ListNode *p = pHead;
while(p)
{
nLength++;
p = p->m_pNext;
}
return nLength;
}
ListNode *FindFirstCommonNode(ListNode *pHead1 , ListNode *pHead2)
{
unsigned int nLength1 = GetListLength(pHead1);
unsigned int nLength2 = GetListLength(pHead2);
int nLengthDif = nLength1 - nLength2;
ListNode *longList = pHead1;
ListNode *shortList = pHead2;
if(nLengthDif < 0)
{
longList = pHead2;
shortList = pHead1;
nLengthDif = -nLengthDif;
}
for(int i = 0 ; i < nLengthDif ; i++)
{
longList = longList->m_pNext;
}
while(longList && shortList && longList->m_nKey != shortList->m_nKey)
{
longList = longList->m_pNext;
shortList = shortList->m_pNext;
}
return longList;
}
int main()
{
ListNode *p1 = new ListNode(1);
ListNode *p2 = new ListNode(2);
ListNode *p3 = new ListNode(3);
ListNode *p4 = new ListNode(4);
ListNode *p5 = new ListNode(5);
p1->m_pNext = p4;
p2->m_pNext = p3;
p3->m_pNext = p4;
//p4->m_pNext = p5;
ListNode *p = FindFirstCommonNode(p1 , p4);
if(p != NULL)
cout<<p->m_nKey<<endl;
else
cout<<"没有公共结点"<<endl;
return 0;
}