输入两个链表,找出它们的第一个公共节点。链表节点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
思路:先得到两个链表的长度,得到两个链表长度的差值,哪个链表长则多走差值步数,然后一起走,直至相撞。耗时O(n+m)。
代码如下:
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!=nullptr)&&(pListHeadShort!=nullptr)&&(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!=nullptr)
{
++nLength;
pNode=pNode->m_pNext;
}
return nLength;
}
}
总结:暴力法O(nm)肯定拿不到offer,再思考一下,两个长度都对效率有影响,那么最快的应该就是O(m+n)。