问题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;
}