题目:
给出两个单链表的头指针h1 h2,判断两个链表是否相交
思路:
1.如果两个链表都没有环:
如果相交:则尾结点一定一样
如果不相交,尾结点不一样
2.一个有环,一个无环,则一定不相交
3.两个都有环,
如果相交,则环为同一个环
如果不相交,则环不一样
首先需要判断是否有环
struct ListNode
{
int m_value;
ListNode* m_pnext;
}ListNode;
bool JudgeCircle(ListNode* head)
{
if(head == NULL) return false;
ListNode* slow = head;
ListNode* fast = head->m_pnext;
while(slow && fast)
{
slow = slow->m_pnext;
fast = fast->m_pnext->m_pnext;
if(slow == fast) return true;
}
return false;
}
然后,如果有环就需要找到环里面的一个结点,然后判断这个结点在不在另一个链表里
寻找一个环里的结点:
ListNode* FindOneNode(ListNode* head)//已经判断出链表有环
{
if(head == NULL) return NULL;
ListNode* p1 = head;
ListNode* p2 = head->m_pnext;
while (p1 && p2)
{
p1 = p1->m_pnext;
p2 = p2->m_pnext->m_pnext;
if(p1 == p2) return p1;
}
return NULL;
}
判断该结点在不在另一个有环的链表里面
bool IsExistInList(ListNode* head2,ListNode* pNode)
{
ListNode* p1 = head2;
ListNode* p2 = head2->m_pnext;
ListNode* pTemp = nullptr;
while(p1 && p2)
{
p1 = p1->m_pnext;
p2 = p2->m_pnext->m_pnext;
if(p1 == p2)
{
pTemp = p1;
break;
}
}
if(pNode == pTemp) return true;
p1 = p1->m_pnext;
while(p1!=pTemp)
{
if(p1 == pNode) return true;
p1 = p1->m_pnext;
}
return false;
}