对于链表相交要分几种情况
1、两无环单链表相交
2、一无环与一有环链表不可能相交
3、两有环链表相交
pLinkNode Noloop_Point(pLinkList plist1, pLinkList plist2) { //两无环链表相交 pLinkNode p1 = Check_Loop(plist1); pLinkNode p2 = Check_Loop(plist2); int l1 = Len(plist1); int l2 = Len(plist2); int l = l1 - l2; pLinkNode cur1 = plist1->_pHead; pLinkNode cur2 = plist2->_pHead; //两无环链表相交 if (l > 0)//链表1较长 { while (l > 0) { cur1 = cur1->next; l--; } while (cur1 != cur2) { cur1 = cur1->next; cur2 = cur2->next; } return cur1; } else { while (l < 0) { cur2 = cur2->next; l++; } while (cur1 != cur2) { cur1 = cur1->next; cur2 = cur2->next; } return cur1; } }
pLinkNode loop_Point(pLinkList plist1, pLinkList plist2)//有环 { pLinkNode cur1 = plist1->_pHead; pLinkNode cur2 = plist2->_pHead; //有环链表相交(交点环外 ) pLinkNode p1 = Loop_en(plist1);//环入口 pLinkNode p2 = Loop_en(plist2); if (p1 == p2)//交点在环外,让环入口指向任一链表的第一个节点,构成环,该环的入口为交点 { p1->next = plist2->_pHead; return Loop_en(plist1); } else return p1;//return p2; }
以下代码为判断链表是否带环
int NoLoop_Cross(pLinkList plist1, pLinkList plist2) //无环链表相交则最后一节点相同 { pLinkNode cur1 = plist1->_pHead; pLinkNode cur2 = plist2->_pHead; while (cur1->next != NULL) { cur1 = cur1->next; } while (cur2->next != NULL) { cur2 = cur2->next; } if (cur1 == cur2) return 1; //相交 else return 0; } int Loop_Cross(pLinkList plist1, pLinkList plist2) //有环链表相交则环内会有相同的节点 { pLinkNode tmp1=Check_Loop(plist1); pLinkNode tmp2 = Check_Loop(plist1); int len = Loop_Len(plist1); while (len--) { if (tmp1 == tmp2) return 1;//相交 tmp1 = tmp1->next; } return 0; } int Link_Cross(pLinkList plist1, pLinkList plist2)//合并以上两个函数 { if (plist1 == NULL || plist2 == NULL) { return 0; } pLinkNode tmp1=Check_Loop(plist1);//判断是否带环,有环返回快慢指针相遇点 pLinkNode tmp2 = Check_Loop(plist2); if (tmp1&&tmp2) { return Loop_Cross(plist1, plist2); } else if (tmp1 == NULL&&tmp2 == NULL) { return NoLoop_Cross(plist1, plist2); } else return 0; }