问题1:判断两链表是否相交
解题思路:
分别遍历两个链表,到达链表末尾时判断两链表的节点是否相同,相同则两链表相交,否则不想交
// 判断两个链表是否相交,假设两个链表都不带环。
int CheckCross(pList list1, pList list2)
{
pLinkNode l1 = list1;
pLinkNode l2 = list2;
if (l1 == NULL || l2 == NULL)
{
return 0;
}
while (l1->next)
{
l1 = l1->next;
} //遍历l1链表至链表末尾
while (l2->next)
{
l2 = l2->next;
}//遍历l2链表至链表末尾
if (l1 == l2) //判断两链表最后的一个节点是否相同,相同则相交返回1
{
return 1;
}
else
return 0;//不同则返回0
}
问题2:若两个链表相交,求这两个链表的交点
解题思路:
分别遍历两个链表,记录两链表的长度len_l1和len_l2,让较长的链表的指针先走|len_l1 - len_l2|步,然后两个指针一起走,两指针相遇的节点就是两个链表的交点。
pLinkNode LinkCrossNode(pList list1, pList list2)
{
int len_l1=0;
int len_l2 = 0;
int len = 0;
pLinkNode l1 = list1;
pLinkNode l2 = list2;
pLinkNode longlink = NULL;
pLinkNode shortlink = NULL;
while (l1)
{
len_l1++;
l1 = l1->next;
}//记录第一个链表长度
while (l2)
{
len_l2++;
l2 = l2->next;
}//记录第二个链表长度
if (len_l1 > len_l2)
{
len = len_l1 - len_l2;
while (len--)
{
list1 = list1->next;
}//较长链表先走len = |len_l1 - len_l2|步
}
else
{
len = len_l2 - len_l1;
while (len--)
{
list2 = list2->next;
}//较长链表先走len = |len_l1 - len_l2|步
}
while (list1!= list2)//两指针同时走,相遇点就是两个链表的交点
{
list1 = list1->next;
list2 = list2->next;
}
return list1;
}