判断两链表是否相交

1.判断链表带不带环
2.如果都不带环,就判断尾节点是否相等
3.如果都带环,判断一条链表上两指针相遇的那个节点,
在不在另一条链表上,如果在,则相交,如果不在,则不相交

那么如何判断是否带环?
设置两个指针 p1 、p2 开始都指向链表的头, p2 每次移动两步
p1每次移动一步,如果存在环,则他们必在环中相遇

#include<iostream>
#include<stdio.h>
#include<assert.h>

typedef struct Listnode
{
    char data;
    Listnode *next; 
}Listnode;

Listnode *head = NULL;

/*
*如果链表有环,则他就没有尾节点,next的值不等于空
*/
bool iscircle (Listnode *head ,Listnode *& circlenode ,Listnode *& lastnode)
{
    Listnode * fast = head -> next;
    Listnode *slow = head;
    while(fast != slow && fast && slow)
    {    

        if(fast -> next != NULL)
        {
            fast = fast -> next;
        }
        if(fast -> next == NULL)
        {
            lastnode = fast;

        }
        if(slow -> next == NULL)
        {
            lastnode = slow;
        }

        if(fast == slow && fast && slow)
        {
            circlenode = fast;
            return true;
        }
        else
        {
            return false;
        }
         fast = fast ->next;
         slow = slow ->next;

    }
}

/*  如果都不带环,就判断尾节点是否相等,如果都带环,判断一链表上两指针相遇的那个节点,在不在另
*外一条链表上 
*/

bool detect(Listnode *head1,Listnode *head2)
{
    Listnode *circlenode1 = NULL;
    Listnode *circlenode2 = NULL;
    Listnode *lastnode1 = NULL;
    Listnode *lastnode2 = NULL;

    bool iscircle1 = iscircle(head1,circlenode1,lastnode1);
    bool iscircle2 = iscircle(head1,circlenode2,lastnode2);

    //一个有环,一个无环
    if(iscircle1 !=  iscircle1)
    {
        return false;

    }

    //两个都无环,判断最后一个节点是否相等
    else if(!iscircle1 && !iscircle2)
    {
        return lastnode1 == lastnode2;
    }
    //两个都有环,判断环里的节点是否在另一个链表环里的节点
    else{
       Listnode *temp = circlenode1 -> next;
       while(temp != circlenode1)

       {
           if(temp == circlenode2)
           {
               return true;
           }
           temp = temp ->next;
       }
       return false;
    }
    return false;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值