2個連結串列判斷查詢是否有公共結點的總結
阿新 • • 發佈:2021-01-12
看到一個題目判斷連結串列是否有公共結點,題目大意如下:
找到兩個單鏈表相交的起始節點。
如下面的兩個連結串列:
在節點 c1 開始相交。
一種解決思想是:A連結串列和B連結串列同時進行向下一個結點進行偏移一位,
假如:當某A結點到了結尾時,開始從B連結串列頭進行向下偏移;當B到達了結尾,開始從A連結串列頭進行偏移
可以這樣理解
A : a1->a2->c1->c2->c3->NULL->b1->b2->b3->c1->c2->c3->NULL
B: b1->b2->b3->c1->c2->c3->NULL->a1->a2->c1->c2->c3->NULL
如果A連結串列B都走了相同的步數會中途相遇(兩者都不是NULL),此時就是連結串列的公共結點位置了,上邊示意倒數第第一個c1就是A和B連結串列的結合點了
如果A和B鏈都走到了最後都為NULL,那麼就沒有公共結點
程式碼如下:
/* *@author: 趙秋然 *@date:2021年1月10日 *@description:連結串列結合點 *@param headA:連結串列1 *@param headB:連結串列2 *@return: 返回連結串列結合點指標 */ ListNode *getNodePtr(ListNode *headA, ListNode *headB) { if (headA == NULL || headB == NULL) { return NULL; } ListNode *curA = headA, * curB = headB; while (curA != curB) { curA = curA ? curA->next : headB; curB = curB ? curB->next : headA; } // 1. 如果中途相交,curA就是結合點 // 2. 如果最終curA為NULL,那麼就是兩個連結串列的結尾了,沒有結合點 return curA; }