您的位置:首页 > 职场人生

剑指offer-面试题37:两个链表中的一个公共结点

2016-04-11 16:26 495 查看
题目:输入连个链表,找出它们的第一个公共结点。

思路:两个链表,用两个指针这个问题就over了。因为每个结点只有一个m_pNext指针,所以第一个公共结点之后,链表合并成一条线,必然成Y型结构。我们用两个指针从表头开始遍历,但是需要注意的是两个链表的长度可能不一样,为了保持两个指针的同步让指向长一些的链表的指针先走,先走的步数即为两个链表的长度差。然后开始同时移动指针,发现相同的结点即返回结点值。另一种思路是把两个链表的结点压入两个栈,因为两个链表从尾结点开始往回退的一部分是相同的,我们不断出栈找出最后一个相同的结点即可(它相对于链表而言是最先的共同结点)。但是这种方法需要额外的O(m+n)空间,两种方法的时间复杂度都是O(m+n)。

ListNode* FindFirstCommonNode(ListNode* pHead1, ListNode* pHead2)
{
unsigned int length1 = GetListLength(ListNode* pHead1);
unsigned int length2 = GetListLength(ListNode* pHead2);

unsigned int LengthDiff = length1 - length2;
ListNode* pHeadLong = pHead1;
ListNode* pHeadShort = pHead2;

if(length1 < length2)
{
pHeadLong = pHead2;
pHeadShort = pHead1;
LengthDiff = length2 - length1;
}

for(int i = 0; i < LengthDiff; ++i)
pHeadLong = pHeadLong->m_pNext;

while(pHeadLong != NULL && pHeadShort != NULL && pHeadLong != pHeadShort)
{
pHeadLong = pHeadLong->m_pNext;
pHeadShort = pHeadShort->m_pNext;
}

return pHeadLong;
}

unsigned int GetListLength(ListNode* pHead)
{
ListNode* pNode = pHead;
int length = 0;
while(pNode != NULL)
{
++length;
pNode = pNode->m_pNext;
}

return length;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: