判斷兩個連結串列是否相交,若相交,求交點。(連結串列可能帶環)
阿新 • • 發佈:2019-01-25
int IsListCrossWithCircle(pList plist1, pList plist2) { pNode pMeetNode1 = NULL, pMeetNode2 = NULL; //杜絕空連結串列的存在 if (NULL == plist1 && NULL == plist2) { return 0; } //先各自判斷兩個連結串列是否帶環(帶環返回相遇點,否則返回空) pMeetNode1 = IsCircle(plist1); pMeetNode2 = IsCircle(plist2); //兩個連結串列都不帶環 if (NULL == pMeetNode1 && NULL == pMeetNode2) { //找兩個連結串列的最後一個結點,然後檢測是否是同一個結點 pNode pTail1 = plist1; pNode pTail2 = plist2; if (pTail1 == NULL || pTail2 == NULL) { return 0; } while (pTail1) { pTail1 = pTail1->next; } while (pTail2) { pTail2 = pTail2->next; } if (pTail1 == pTail2) { return 1; } } //兩個連結串列均帶環 else if (pMeetNode1 && pMeetNode2) { pNode pCur = pMeetNode1; do { if (pCur == pMeetNode2) { return 2; } pCur = pCur->next; }while (pCur->next != pMeetNode1);//繞環一週 } return 0; }