带头结点的单链表相关(1)

单链表常见习题(1)

判断两个单链表是否相交,并且返回交点的节点

思路分析

判断两个单链表是否相交,有两种思路:
1.对两个一直遍历到最后一个节点,判断最后一个节在这里插入代码片点地址是否相等 。如果两个链表最后一个节点的地址相等,则至少有一个链表结点是相互重合的。但是这种方法不能确定交点,只能去确定是否有交点。
2.对于两个链表,可以用一种对齐的方法然后再逐项对比。一直遇到相等的一个链表结点,即可以返回此节点。但是两个链表不一定是等长的,则可以先遍历一下两个链表的差值,然后对两个链表同时对比,既可以确定出重合节点。

代码

node* isxiangjiao(plist list1, plist list2)
{
    
    
	deterlist(list1);
	deterlist(list2);   //一直遍历到最后一个节点,判断最后一个节点地址是否相等   这种方法不能确定交点,只能去确定是否相交
	

	//思路:先求出差值,让长的先跑差值个。然后同时往后跑,边跑边比较,一旦相等,返回此节点
	int len1 = getlength(list1);
	int len2 = getlength(list2);
	plist p = list1;
	plist q = list2;

	if (len1 > len2)
	{
    
    
		for (int i = 0; i < len1 - len2; i++)
		{
    
    
			p = p->next;
		}
	}
	else
	{
    
    
		for (int i = 0; i < len2 - len1; i++)
		{
    
    
			q = q->next;
		}
	}
	while (p != NULL && q != NULL)
	{
    
    
		if (p == q)
		{
    
    
			return p;
		}
		p = p->next;
		q = q->next;
	}
	return NULL;
}

猜你喜欢

转载自blog.csdn.net/ALITAAAA/article/details/105667897