单链表常见习题(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;
}