现在的位置: 首页 > 综合 > 正文

12-3-30关于链表相交

2018年01月10日 ⁄ 综合 ⁄ 共 876字 ⁄ 字号 评论关闭

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,然后这样使得两个链表出发点到相交点长度是一致的,之后两个链表指针相同步伐前进,相遇的第一个点为

相交点。

抱歉!评论已关闭.