1. 程式人生 > >Leetcode中級 相交連結串列(160)C++

Leetcode中級 相交連結串列(160)C++

編寫一個程式,找到兩個單鏈表相交的起始節點。

例如,下面的兩個連結串列:

A:          a1 → a2
                   ↘
                     c1 → c2 → c3
                   ↗            
B:     b1 → b2 → b3

在節點 c1 開始相交。

注意:

如果兩個連結串列沒有交點,返回 null.
在返回結果後,兩個連結串列仍須保持原有的結構。
可假定整個連結串列結構中沒有迴圈。
程式儘量滿足 O(n) 時間複雜度,且僅用 O(1) 記憶體。

思路:先分別計算A,B連結串列的長度lenA,lenB,sub = lenA-lenB,長的那個連結串列先走sub步,然後一起走,值相同時便是相交結點;若走完都沒有相同結點的值則兩連結串列不相交

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if(!headA || !headB)
            return nullptr;
        int lenA = 0, lenB = 0;
        ListNode* copyA = headA;
        ListNode* copyB = headB;
        while(headA && headA->next)
        {
            lenA++;
            headA = headA->next;
        }
        while(headB && headB->next)
        {
            lenB++;
            headB = headB->next;
        }
        int sub = lenA - lenB;
        if(sub > 0)
            while(sub--)
                copyA = copyA->next;
        else
            while(sub++)
                copyB = copyB->next;
        while(copyA)
        {
            if(copyA->val == copyB->val)
                return copyA;
            copyA = copyA->next;
            copyB = copyB->next;
        }
        return nullptr;
    }
};