求两个单链表交点and判断链表是否有环

求单链表交点算法

先求得两条链表各自的长度,如果最后一个节点的地址相同,则确定链表有交点。然后求出长度差值k,让长的链表指针先走k步,然后两个链表指针同时走,边走边比较,第一次相等处即是交点。

代码:

struct Node  
{  
    int data;  
    struct Node * next;  
};  
  
 Node* FixIntersetion(Node* pHead1, Node* pHead2)  
{  
    Node* p1 = pHead1;  
    Node* p2 = pHead2;  
    int i = 1, j = 1, k = 0, diff = 0;  
    //如果都是空链表,肯定没有交点  
    if(pHead2 == NULL || pHead2 == NULL)  
    {  
        return NULL;  
    }  
    //获取链表长度  
    while(p1->next != NULL)  
    {  
        p1 = p1->next;  
        i++;  
    }  
    while(p2->next != NULL)  
    {  
        p2 = p2->next;  
        j++;  
    }  
    //开始判断是否存在交点  
    if(p1 != p2)  
    {//根据有交点时,两个链表在交点及其之后的部分是公共的,因此,有交点的单链表的尾节点必定相同  
        return NULL;        //如果尾节点不同,直接返回NULL  
    }  
    else                   //否则寻找第一个相同的节点  
    {  
        p1=pHead1;  
        p2=pHead2;  
        //使得两者的起始比较位置离尾部的长度一致  
        if(i>j)  
        {  
            diff=i-j;   
            for(k=0; k<diff; k++)  
            {  
                p1 = p1->next;  
            }  
        }  
        if(i<j)  
        {  
            diff=j-i;   
            for(k=0; k<diff; k++)  
            {  
                p2 = p2->next;  
            }  
        }  
        //开始比对,得出交点  
        while(p1 != p2)  
        {  
            p1 = p1->next;  
            p2 = p2->next;  
        }  
        return p1;  
    }  
}  

判断链表是否有环算法

两个指针一快一慢,快指针一次走两步,慢指针一次走一步,如果快指针首先走到头则无环。如果快慢指针会相等,则有环。

代码

bool FixRing(Node * pHead)  
{  
    Node * pSlow = pHead ;  
    Node * pFast = pHead;  
  
    while ( pFast && pFast -> next )  //如果存在环,不存在p-next=NULL的情况  
    {  
        pSlow = pSlow -> next;//前进一步  
        pFast = pFast -> next -> next;//前进两步  
        if ( pSlow == pFast )   
            break ;  
    }  
    return   ! (pFast == NULL || pFast -> next == NULL);  
}  




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值