单链表 --- 环相关问题(是否存在环是否相交)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单链表 --- 环相关问题(是否存在环是否相交)相关的知识,希望对你有一定的参考价值。
一、两单链表皆不带环 --->
是否存在“环”及 环长
方法:借助于 快慢指针 ,两指针是否存在相遇情况(存在,即存在环;反之,不存在)
环长:相遇时开始计算慢指针所走过距离,即为环长
int IsCycle(ListNode *_head) //是否存在环 及 环长(两链表不带环) { ListNode *fast=_head; ListNode *slow=_head; while (fast&&fast->_next&&fast->_next->_next) { fast = fast->_next->_next; slow = slow->_next; if(fast==slow)//存在环 { int count=0; while(slow->_next==slow) { ++count; slow=slow->_next; } return count; } } return 0; }
2. 相交问题(两链表不带环)
方法1:两单链表的尾节点地址是否相同(同则相交,反之不相交)
相交结点:选择两链表中较短的链表,先遍历较长链表,直至两链表剩余长度相同时同时遍历,此时开始计时,直至两者相遇时,计时的数据即为相遇时的节点
int IsCross(ListNode *l1,ListNode *l2)//是否相交 及(两链表不带环) { ListNode *head=NULL; ListNode *tail=NULL; if(l1==NULL||l2==NULL) { printf("两链表不相交\n"); return 0; } else { int len1=0,len2=0; while(l1) { ++len1; head=head->_next; } while(l2) { ++len2; tail=head->_next; } if(&head==&tail) { int gap=0; int count=0; printf("两链表相交\n"); if(len1<len2) { int tmp=len1; len1=len2; len2=tmp; } gap=len1-len2; while(l1) { ++len1; head=head->_next; if(len1=gap) { while(l1) { head=head->_next; while(l2) { ++count; tail=head->_next; if(head==tail) { return count; } } } } } } else { printf("两链表不相交\n"); return 0; } } }
本文出自 “花开彼岸” 博客,请务必保留此出处http://zxtong.blog.51cto.com/10697148/1757709
以上是关于单链表 --- 环相关问题(是否存在环是否相交)的主要内容,如果未能解决你的问题,请参考以下文章