面试题:两个链表的第一个公共节点
2018-02-03 12:24
465 查看
输入两个链表,找出它们的第一个公共节点。链表节点定义如下:
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)。
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)。
相关文章推荐
- 剑指offer——面试题37:两个链表的第一个公共节点
- 面试题52:两个链表的第一个公共节点
- 剑指offer 面试题37—两个链表的第一个公共节点
- 面试题04:找出两个单向链表的第一个公共节点
- 面试题37:两个链表的第一个公共节点
- 面试题 37 两个链表的第一个公共节点
- 微软面试题:找到两个单向链表的第一个公共节点
- 面试题37:两个链表的第一个公共节点
- [剑指offer][面试题37]两个链表的第一个公共节点
- 面试题37:两个链表的第一个公共节点
- 【剑指offer】面试题52:两个链表的第一个公共节点
- 【面试题】剑指Offer-37-求两个链表的第一个公共节点
- 剑指offer-面试题37 两个链表的第一个公共节点
- 面试题之包含min函数的栈,两个链表的第一个公共节点
- 《剑指Offer》面试题:寻找两个链表的第一个公共节点
- 两个链表的第一个公共节点
- 数据结构之链表面试题汇总(四)得到两个单链表相交的第一个交点、用O(1)的时间效率删除单向链表中的指定节点
- 剑指offer----两个链表的第一个公共节点----java实现
- 两个链表的第一个公共节点
- Intersection of Two Linked Lists(两个链表的第一个公共节点)