链表相交及交点求解

对于链表相交要分几种情况

1、两无环单链表相交

2、一无环与一有环链表不可能相交

3、两有环链表相交



pLinkNode Noloop_Point(pLinkList plist1, pLinkList plist2)
{	//两无环链表相交
	pLinkNode p1 = Check_Loop(plist1);
	pLinkNode p2 = Check_Loop(plist2);
	int l1 = Len(plist1);
	int l2 = Len(plist2);
	int l = l1 - l2;
	pLinkNode cur1 = plist1->_pHead;
	pLinkNode cur2 = plist2->_pHead;
	//两无环链表相交
	
		if (l > 0)//链表1较长
		{
			while (l > 0)
			{
				cur1 = cur1->next;
				l--;
			}
			while (cur1 != cur2)
			{
				cur1 = cur1->next;
				cur2 = cur2->next;
			}
			return cur1;
		}
		else
		{
			while (l < 0)
			{
				cur2 = cur2->next;
				l++;
			}
			while (cur1 != cur2)
			{
				cur1 = cur1->next;
				cur2 = cur2->next;
			}
			return cur1;
		}
}



pLinkNode loop_Point(pLinkList plist1, pLinkList plist2)//有环
{
	pLinkNode cur1 = plist1->_pHead;
	pLinkNode cur2 = plist2->_pHead;
	//有环链表相交(交点环外 )
	pLinkNode p1 = Loop_en(plist1);//环入口
	pLinkNode p2 = Loop_en(plist2);
	if (p1 == p2)//交点在环外,让环入口指向任一链表的第一个节点,构成环,该环的入口为交点
	{
		p1->next = plist2->_pHead;
		return Loop_en(plist1);
	}
	else
		return p1;//return p2;
}

以下代码为判断链表是否带环

int NoLoop_Cross(pLinkList plist1, pLinkList plist2)
//无环链表相交则最后一节点相同
{
	pLinkNode cur1 = plist1->_pHead;
	pLinkNode cur2 = plist2->_pHead;
	while (cur1->next != NULL)
	{
		cur1 = cur1->next;
	}
	while (cur2->next != NULL)
	{
		cur2 = cur2->next;
	}
	if (cur1 == cur2)
		return 1;  //相交
	else
		return 0;
}

int Loop_Cross(pLinkList plist1, pLinkList plist2)
//有环链表相交则环内会有相同的节点
{
	pLinkNode tmp1=Check_Loop(plist1);
	pLinkNode tmp2 = Check_Loop(plist1);
	int len = Loop_Len(plist1);
	while (len--)
	{
		if (tmp1 == tmp2)
			return 1;//相交
		tmp1 = tmp1->next;
	}
	return 0;
}
int Link_Cross(pLinkList plist1, pLinkList plist2)//合并以上两个函数
{
	if (plist1 == NULL || plist2 == NULL)
	{
		return 0;
	}
	pLinkNode tmp1=Check_Loop(plist1);//判断是否带环,有环返回快慢指针相遇点
	pLinkNode tmp2 = Check_Loop(plist2);
	if (tmp1&&tmp2)
	{
		return Loop_Cross(plist1, plist2);
	}
	else if (tmp1 == NULL&&tmp2 == NULL)
	{
		return NoLoop_Cross(plist1, plist2);
	}
	else
		return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值