12-3-30关于链表相交

本文详细介绍了如何使用双指针法检测链表中是否存在环,并通过循环计算找到环的入口点。同时,提供了两种方法判断两个链表是否相交,包括将其中一个链表首尾相连检测环的存在,以及直接比较两个链表是否在某个点相遇。

1判断链表是否有环?

bool IsExitsLoop(sList *head){
sList *slow=head;
sList *fast=head;
while(fast && fast->next){
slow=slow->next;
fast=fast->next->next;
if(slow==fast) break;
}


return !(fast == NULL || fast->next==NULL);
}


2 找环的入口点

设整个链表长度为L,环长度为r,入口环与相遇点距离为x,起点到环入口点的距离为a。

对于slow走了s,则fast走了2s

s=a+x;

2s=a+nr+x;

==>a+x=nr;

设相遇点到入口环的距离为y=r-x,==>a=(n-1)r+y 

因此我们设定一个指针p,指向相遇点,指针q从head出发,这样他们一定会在环入口相遇,由此我们得到环入口


sList *findLoopPort(sList *head){
sList *slow=head,*fast=head;
while(fast && fast->next){
slow=slow->next;
fast=fast->next->next;
if(slow==fast) break;
}


if(fast==NULL || fast->next==NULL){
return (sList *)NULL;
}


slow=head;
while(slow!=fast){
slow=slow->next;
fast=fast->next;
}
return slow;
}


3判断两个链表是否相交(链表不存在环)

 方法一:

将其中一个链表,首尾相连,检测两外一个链表是否有环,如果存在,则代表两个链表相交,检测出来的环入口点,即为相交点

方法二:

如果两个链表相交,则从相交点开始,到链表结束都是相同的节点,我们可以先遍历一个链表直到尾部,再遍历一个链表,如果也走到相同的尾部,则相交。

此时我们记录两个链表的length,利用length1-length2,然后这样使得两个链表出发点到相交点长度是一致的,之后两个链表指针相同步伐前进,相遇的第一个点为

相交点。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值