链表常见面试题四:解决链表相交问题

来源:互联网 发布:淘宝发布宝贝过程好慢 编辑:程序博客网 时间:2024/06/06 07:40

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

 

0 0
原创粉丝点击