题目:输入两个链表,找出它们的第一个公共结点。
解法一:不采用任何辅助数据结构,剑指offer标准代码
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* pFisrtCommonNode = pListHeadLong;
return pFisrtCommonNode;
}
解法二:采用辅助数据结构栈,剑指offer只提出思想没有实现
ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2)
{
ListNode* pTemp1 = pHead1;
ListNode* pTemp2 = pHead2;
ListNode* pFirstCommonNode = NULL;
std::stack<ListNode*> ListStack1;
std::stack<ListNode*> ListStack2;
while(pTemp1!=NULL)
{
ListStack1.push(pTemp1);
pTemp1 = pTemp1->m_pNext;
}
while(pTemp2!=NULL)
{
ListStack2.push(pTemp2);
pTemp2 = pTemp2->m_pNext;
}
while(ListStack1.empty() == false && ListStack2.empty() == false)
{
pTemp1 = ListStack1.top();
pTemp2 = ListStack2.top();
if(pTemp1 != pTemp2)
break;
pFirstCommonNode = pTemp1;
ListStack1.pop();
ListStack2.pop();
}
return pFirstCommonNode;
}