您的位置:首页 > 其它

求两个链表的第一个公共结点

2016-10-27 21:15 447 查看
代码:

//结点
struct ListNode
{
int m_val;
ListNode* m_pNext;
};

//第一种方法,需要两个辅助栈
ListNode* FirstCommonNode(ListNode* & pList1, ListNode* & pList2)
{
if (pList1 == nullptr || pList2 == nullptr)
return nullptr;

stack<ListNode*> sk1, sk2;
ListNode* p1 = pList1;
ListNode* p2 = pList2;

while (p1 != nullptr)
{
sk1.push(p1);
p1 = p1->m_pNext;
}

while (p2 != nullptr)
{
sk1.push(p2);
p2 = p2->m_pNext;
}
ListNode* p_first_node = nullptr;
while (!sk1.empty() && !sk2.empty())
{
p1 = sk1.top();
p2 = sk2.top();
if (p1->m_val == p2->m_val)
{
sk1.pop();
sk2.pop();
p_first_node = p1;
}
}
return p_first_node;
}

//第二种方法,分别遍历两个链表求出长度,再根据长度差让较长的先走若干步,即可
ListNode* FirstCommonNode2(ListNode* & pList1, ListNode* & pList2)
{
if (pList1 == nullptr || pList2 == nullptr)
return nullptr;

ListNode* pHead1 = pList1;
ListNode* pHead2 = pList2;
int length_list1 = 0;
int length_list2 = 0;

//先分别求出两个链表的长度
while (pHead1 != nullptr)
{
length_list1++;
pHead1 = pHead1->m_pNext;
}

while (pHead2 != nullptr)
{
length_list2++;
pHead2 = pHead2->m_pNext;
}

int length_diff = length_list1 > length_list2 ? length_list1 - length_list2 : length_list2 - length_list1;

if (length_list1 > length_list2)
{
while (length_diff--)
{
pHead1 = pHead1->m_pNext;
}
}
else
{
while (length_diff--)
{
pHead2 = pHead2->m_pNext;
}
}

while ((pHead1 != nullptr) && (pHead2 != nullptr) &&(pHead1->m_val != pHead2->m_val))
{
pHead1 = pHead1->m_pNext;
pHead2 = pHead2->m_pNext;
}
return pHead1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: