Leetcode中級 相交連結串列(160)C++
阿新 • • 發佈:2018-12-01
編寫一個程式,找到兩個單鏈表相交的起始節點。
例如,下面的兩個連結串列:
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; } };