1. 程式人生 > 其它 >2個連結串列判斷查詢是否有公共結點的總結

2個連結串列判斷查詢是否有公共結點的總結

看到一個題目判斷連結串列是否有公共結點,題目大意如下:

找到兩個單鏈表相交的起始節點。

如下面的兩個連結串列

在節點 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;
}