#include "List.h"
#include <cmath>
using namespace std;
//判断链表有无环
Node* getLoop(Node* head)
{
if(head == nullptr || head->next == nullptr)
return nullptr;
Node* n1 = head->next;
Node* n2 = head->next->next;
while(n1 != n2)
{
if(n2->next == nullptr || n2->next->next == nullptr)
return nullptr;
n2 = n2->next->next;
n1 = n1 ->next;
}
n2 = head;
while(n2 != n1)
{
n1 = n1->next;
n2 = n2->next;
}
return n1;
}
//判断俩个无环链表是否相交
Node* noLoop(Node* head1, Node* head2)
{
if(head1 == nullptr || head2 == nullptr)
return nullptr;
Node* cur1 = head1;
Node* cur2 = head2;
int n = 0;
while(cur1->next)
{
++n;
cur1 = cur1->next;
}
while(cur2->next)
{
--n;
cur2 = cur2->next;
}
if(cur1 != cur2)
return nullptr;
cur1 = n > 0 ? head1: head2;
cur2 = cur1 == head1 ? head2 : head1;
n = abs(n);
while(n != 0)
{
--n;
cur1 = cur1->next;
}
while(cur1 != cur2)
{
cur1 = cur1->next;
cur2 = cur2->next;
}
return cur1;
}
//判断俩个有环链表是否相交
Node* bothLoop(Node* head1, Node* loop1, Node* head2, Node* loop2)
{
Node* cur1 = nullptr;
Node* cur2 = nullptr;
if(loop1 == loop2)
{
cur1 = head1;
cur2 = head2;
int n = 0;
while(cur1 != loop1)
{
++n;
cur1 = cur1->next;
}
while(cur2 != loop1)
{
--n;
cur2 = cur2->next;
}
cur1 = n > 0 ? head1 : head2;
cur2 = cur1 == head1 ? head2 : head1;
n = abs(n);
while(n != 0)
{
--n;
cur1 = cur1->next;
}
while(cur1 != cur2)
{
cur1 = cur1->next;
cur2 = cur2->next;
}
return cur1;
}
else
{
cur1 = loop1->next;
while(cur1 != loop1)
{
if(cur1 == loop2)
return loop1;
cur1 = cur1->next;
}
return nullptr;
}
return nullptr;
}
Node* getInsert(Node* head1, Node* head2)
{
if(head1 == nullptr || head2 == nullptr)
return nullptr;
Node* loop1 = getLoop(head1);
Node* loop2 = getLoop(head2);
if(loop1 == nullptr && loop2 == nullptr)
return noLoop(head1, head2);
if(loop1 && loop2)
return bothLoop(head1, loop1, head2, loop2);
return nullptr;
}
int main()
{
Node* pNode0 = new Node(0);
Node* pNode1 = new Node(1, pNode0);
Node* pNode2 = new Node(2, pNode1);
Node* pNode3 = new Node(2, pNode2);
Node* pNode4 = new Node(1, pNode3);
Node* pNode5 = new Node(0, pNode4);
Node* pNode = getInsert(pNode3, pNode5);
cout << pNode->value << endl;
}
俩个单链表相交的一系列问题
猜你喜欢
转载自blog.csdn.net/wzc2608/article/details/80677076
今日推荐
周排行