单链表 --- 环相关问题(是否存在环是否相交)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单链表 --- 环相关问题(是否存在环是否相交)相关的知识,希望对你有一定的参考价值。

一、两单链表皆不带环 --->

  1. 是否存在“环”及 环长

    方法:借助于 快慢指针 ,两指针是否存在相遇情况(存在,即存在环;反之,不存在)

          环长:相遇时开始计算慢指针所走过距离,即为环长

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

以上是关于单链表 --- 环相关问题(是否存在环是否相交)的主要内容,如果未能解决你的问题,请参考以下文章

判断一个单链表是否存在环

单链表交叉问题(单链表存在环的问题)

判断链表中是否有环 ----- 有关单链表中环的问题

判断单链表是否存在环及寻找环的入口点

java判断两个单链表是否相交

算法面试