首页 > 其他 > 详细

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

时间:2016-03-28 21:59:08      阅读:190      评论:0      收藏:0      [点我收藏+]

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

  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

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

原文:http://zxtong.blog.51cto.com/10697148/1757709

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!