本來想自己寫,寫了一半發現一篇文章,解釋寫得簡單易懂,我就直接拿過來了。
這個問題值得反復地寫,鍛煉鏈表coding能力的好題。
?
?
//如果兩個鏈表都不帶環
int NotCycleCheckCross(pLinkNode head1,pLinkNode head2)
{pLinkNode list1 = head1->next;pLinkNode list2 = head2->next;if ((NULL==list1 )||(NULL==list2)){return 0; //不相交}while (NULL != list1->next){list1 = list1->next;}while (NULL != list2->next){list2 = list2->next;}if (list1==list2){return 1; //相交}return 0; //不相交
}//鏈表帶環,判斷兩個鏈表是否相交
int CycleCheckCross(pLinkNode meet1, pLinkNode meet2)
{pLinkNode cur = meet1->next;if (meet1 == meet2){return 1; //鏈表相交}while ((cur != meet1)&&(cur!=meet2)){cur = cur->next;}if (cur == meet2){return 1; //鏈表相交}return 0; //不相交
}
//將上面兩個函數封裝成一個函數int CheckCross(pLinkNode head1, pLinkNode head2) //參數為兩個頭結點{pLinkNode fast = NULL;pLinkNode slow = NULL;pLinkNode meet1 = NULL;pLinkNode meet2 = NULL;if (head1->next == NULL || head2->next == NULL){return 0; //至少一個鏈表為空鏈表,則兩個鏈表一定不相交}fast = head1->next;slow = head1->next;while (fast&&fast->next) //判斷鏈表head1是否帶環{fast = fast->next->next;slow = slow->next;if (fast == slow){meet1 = fast;break;}}fast = head2->next;slow = head2->next;while (fast&&fast->next) //判斷鏈表head2是否帶環{fast = fast->next->next;slow = slow->next;if (fast == slow){meet2 = fast;break;}}if ((meet1 == NULL) && (meet2 == NULL)) //如果兩個鏈表都不帶環{return NotCycleCheckCross(head1, head2);}else if (meet1&&meet2) //如果兩個鏈表都帶環{return CycleCheckCross(meet1, meet2);}//如果兩個鏈表一個帶環一個不帶環,則一定不相交直接返回0return 0; //不相交}
原文https://blog.csdn.net/lf_2016/article/details/51756644