c++数据结构-判断两个单链表是否相交,相交的第一个节点

c++数据结构-判断两个单链表是否相交,相交的第一个节点

1:判断两个单链表是否相交

//判断两个单链表是否相交(判断尾节点是否相同)
bool isIntersect(ListNode* p1, ListNode* p2)
{
	ListNode* pHead1 = p1;
	ListNode* pHead2 = p2;

	if (pHead1 == nullptr || pHead2 == nullptr)
	{
		return false;
	}
	while (pHead1->pNext != nullptr)
	{
		pHead1 = pHead1->pNext;
	}
	while (pHead2->pNext != nullptr)
	{
		pHead2 = pHead2->pNext;
	}
	//判断尾节点是否相同
	if (pHead1 == pHead2)
	{
		return true;
	}
	else
	{
		return false;
	}

2:求两条链表相交的第一个节点

思路:求出长度,然后到同一起跑线上一起移动,相遇就是第一个相交节点)
c++数据结构-判断两个单链表是否相交,相交的第一个节点_第1张图片

//找到两条单链表相交的第一个节点
ListNode *detectCycle(ListNode *pHead1, ListNode *pHead2)
{
	if (pHead1 == nullptr || pHead2 == nullptr)
	{
		return nullptr;
	}

	ListNode* p1 = pHead1;
	ListNode* p2 = pHead2;
	unsigned int len1=1;
	unsigned int len2=1;
	unsigned int len3 = 0;

	while (p1->pNext != nullptr)
	{
		len1++;
		p1 = p1->pNext;
	}
	while (p2->pNext != nullptr)
	{
		len2++;
		p2 = p2->pNext;
	}
	if (len1> len2) 
	{
		len3 = len1 - len2;
		while (len3!=0)
		{
			len3--;
			p1 = p1->pNext;
		}
	}
	else
	{
		len3 = len2 - len1;
		while (len3!=0)
		{
			len3--;
			p2 = p2->pNext;
		}
	
	}
	while (p1!=p2)
	{		
		p1 = p1->pNext;
		p2 = p2->pNext;
	}
	return p1;

}

你可能感兴趣的:(数据结构)