俩个单链表相交的一系列问题

#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