struct ListNode{
int value;
ListNode *next;
};
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->next;
while((pListHeadLong != NULL)&&(pListHeadShort!= NULL)&&(pListHeadLong != pListHeadShort))
{
pListHeadLong=pListHeadLong->next;
pListHeadShort=pListHeadShort->next;
}
//得到第一个公共结点
ListNode *pFirstCommonNode=pListHeadLong;
returnpFirstCommonNode;
}
unsigned int GetListLength(ListNode *pHead)
{
unsigned int nLength=0;
ListNode *pNode=pHead;
while(pNode != NULL)
{
++nLength;
pNode=pNode->next;
}
return nLength;
}
相关题目:树中两个结点的最低公共祖先(见链接)
http://blog.youkuaiyun.com/insistgogo/article/details/9934153