判断两个链表是否相交

本文介绍了如何判断两个单向链表是否相交,并提供了三种方法:通过构造新链表判断环;计算长度后从长链表末尾开始同步遍历;使用栈对比节点。详细代码实现辅助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    给出两个单向链表的头指针,比如pHead1和pHead2,判断这两个链表是否相交,如果相交求出第一个相交的结点。
    方法一:由于两个链表没有环,我们可以把第二个链表的尾指针指向第一个链表的头结点,此时我们从链表二出发,判断这个新的链表是否存在环,如果存在环则说明这两个链表相交,否则,这两个链表不相交。环的连接点即两个链表的第一个交点。在上一篇博客中我们已经说过如何判断一个链表是否存在环,而且我们也求出带环链表的连接点。在此我们不在写代码。
    方法二:如果两个没有环的链表相交于某一点的话,那么在这个节点之后的所有的节点都是两个链表所共有的。根据这个性质,我们可以得到:如果两个链表相交,那么最后一个节点一定是共有的。首先,我们先遍历第一个链表,记住最后一个节点,然后遍历第二个链表,到最后一个节点时,我们和第一个链表的最后一个节点做比较,如果相同,则相交,否则,不想交。
运用此方法,我们求第一个相交的节点,首先我们求出链表一的长度len1和链表二的长度len2,如果链表一的长度大于链表二的长度,那么我们先让指向链表一的指针向后移动len1 - len2步,然后两个指针同时出发,判断两个指针是否相等,首次相等的时候,即两个链表的交点。
//判断两个链表是否相交
bool isIntersect01(ListNode *pHead1,ListNode *pHead2)
{
	if(pHead1 == NULL || pHead2 == NULL)
		return false;
	while(pHead1->next)
	{
		pHead1 = pHead1->next;
	}

	while(pHead2->next)
	{
		pHead2 = pHead2->next;
	}

	if(pHead1 == pHead2)
	{
		return true;
	}
	else
	{
		return false;
	}
}
ListNode * getIntersect(ListNo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值