一、两单链表皆不带环 --->
是否存在“环”及 环长
方法:借助于 快慢指针 ,两指针是否存在相遇情况(存在,即存在环;反之,不存在)
环长:相遇时开始计算慢指针所走过距离,即为环长
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
原文地址:http://zxtong.blog.51cto.com/10697148/1757709