判断两个单链表相交问题

#include<iostream>
#include<vector>
#include<stack>
#include<math.h>
using namespace std;
typedef struct ListNode
{
	int val;
	ListNode * next;

}*List;
//判断是否有换,如果有环,则返回入环节点
List getLoopNode(List head)
{
	List p = head->next;
	List fast = p->next;
	List slow = p;
	while (slow != fast)
	{
		if (fast != NULL || fast->next != NULL)

			return NULL;
			fast = fast->next->next;
			slow = slow->next;
		
	}
	fast = p;
	while (fast != slow)
	{
		fast = fast->next;
		slow = slow->next;
	}
	return fast;
}
//如果两个单链表都没有环,先遍历链表求取链表长度,然后判断两个链边末尾指针地址是否
//一致,如果不一致一定不相交,如果一致,把长链表的长的部分去掉,和短链表一起遍历,
//相遇点就是相遇点
List getIntersection(List head1, List head2)
{
	head1 = head1->next;
	head2 = head2->next;
	List cur1 = head1;
	List cur2 = head2;
	int len1 = 0;
	int len2 = 0;
	List end1 = cur1;
	List end2 = cur2;

	while (cur1 != NULL)
	{
		
		end1 = cur1;
			len1++;
		cur1 = cur1->next;
	}
	while (cur2 != NULL)
	{
		end2 = cur2;
		len2++;
		cur2 = cur2->next;
	}
	if (end1 != end2)
		return NULL;
	int dist = abs(len1 - len2);
	cur1 = len1 > len2 ? head1 : head2;//cur1指向长链
	cur2 = len1 > len2 ? head2 : head1;//短链
	int count = 0;
	while (count != dist)
	{
		count++;
		cur1 = cur1->next;
	}
	while (cur1 != cur2)
	{
		cur1 = cur1->next;
		cur2 = cur2->next;
	}
	return cur1;//相交点
}
//如果两个链表一个有环,一个无环,那么是不可能相交的
//两个都有环,那么要分情况讨论:
//1.两个链表不相交

//2.两个链表先相交,再有环
//3.两个链表在环山相交
List boothloop(List head1, List loop1, List head2, List loop2)
{
	head1 = head1->next;
	head2 = head2->next;
	List cur1 = head1;
	List cur2 = head2;
	int len1 = 0;
	int len2 = 0;
	
	if (loop1 == loop2)//入环结点相同,则是先相交,在有环,相交部分不用考虑环
	{
		while (cur1!=NULL)
		{
			
			len1++;
			cur1 = cur1->next;
		}
		while (cur1 != NULL)
		{
			
			len2++;
			cur2 = cur2->next;
		}
		int dist = abs(len1 - len2);
		cur1 = len1 > len2 ? head1 : head2;//长
		cur2 = len1 > len2 ? head2 : head1;//短
		int count = 0;
		while (count != dist)
		{
			count++;
			cur1 = cur1->next;

		}
		while (cur1 != cur2)
		{
			cur1 = cur1->next;
			cur2 = cur2->next;
		}
		return cur1;
		
	}
	else//入环结点不同
	{
		List cur = loop1->next;
		while (loop1 != cur)
		{
			if (cur1 == loop2)
			{
				return cur;
			}
			cur = cur->next;
		}

		return NULL;
	}



}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值