C++判断两个链表是否相交算法
生活随笔
收集整理的這篇文章主要介紹了
C++判断两个链表是否相交算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.判斷一個鏈表是否相交,若相交,求交點(假設鏈表帶環)
2.具體思路如下圖所示
既然已經分析清楚,那么代碼就很好實現了.
Node* IsHaveCrossNode(Node* head1,Node* head2){assert(head1);assert(head2);Node* meetNode1 = IsCircle(head1);Node* meetNode2 = IsCircle(head2);//排除第1種情況if (meetNode1 == NULL || meetNode2 == NULL){return NULL;}//說明兩個鏈表都帶環//根據相遇點排除第2種情況Node* cur1 = meetNode1->_next;while (cur1 != meetNode1 && cur1 != meetNode2){cur1 = cur1->_next;}if (cur1 != meetNode2){return NULL;}//區分第3和第4種情況(需要求出兩個入口點)Node* entry1 = GetEntryNode(head1, meetNode1);Node* entry2 = GetEntryNode(head2, meetNode2);//第3種情況(轉化為求兩個鏈表的交點,鏈表不帶環時)if (entry1 == entry2){entry1->_next = NULL;entry2->_next = NULL;Node* meet = IsMeet(head1, head2);return meet;}//第4種情況(有兩個入口點,返回一個即可)return entry1;} 內部調用的函數如下: //判斷一個鏈表是否帶環//思路:快慢指針,返回相遇點Node* IsCircle(Node* head){if (head == NULL){return NULL;}Node* pFast = head;Node* pSlow = head;//快指針一次走兩步,慢指針一次走一步while (pFast && pFast->_next){pFast = pFast->_next->_next;pSlow = pSlow->_next;if (pFast == pSlow){break;}}if (pFast && pFast->_next){return pFast;}return NULL;}Node* GetEntryNode(Node* head, Node* meetNode){assert(head && meetNode);Node* p1 = head;Node* p2 = meetNode;while (p1 != p2){p1 = p1->_next;p2 = p2->_next;}return p1;}//判斷是否相交,判斷尾節點//若相交,則返回交點Node* IsMeet(Node* head1,Node* head2){assert(head1 && head2);Node* cur1 = head1;int count1 = 0;Node* cur2 = head2;int count2 = 0;while (cur1->_next){++count1;cur1 = cur1->_next;}while (cur2->_next){count2++;cur2 = cur2->_next;}if (cur1 != cur2){return NULL;//說明沒有交點}int D_val = count2 - count1;if (D_val < 0){D_val = -D_val;}//cur1 = head1;cur2 = head2;if (count1 < count2){//讓head2鏈表先走D_val長度while (cur2 && D_val--){cur2 = cur2->_next;}while (cur2 && cur1 != cur2){cur1 = cur1->_next;cur2 = cur2->_next;}if (cur1 == cur2){return cur1;}}else{//讓head1鏈表先走D_val長度while (cur1 && D_val--){cur1 = cur1->_next;}while (cur1 && cur1 != cur2){cur1 = cur1->_next;cur2 = cur2->_next;}if (cur1 == cur2){return cur1;}}return NULL;}?
總結
以上是生活随笔為你收集整理的C++判断两个链表是否相交算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 莮亾芣湜唥洫,莮亾竾浍哭
- 下一篇: c语言两个矩形相交部分坐标,C++判断矩