戴爾釋出全新超薄 Soundbar 條狀音箱:全球最薄最輕
阿新 • • 發佈:2020-10-07
編寫一個程式,找到兩個單鏈表相交的起始節點。
如下面的兩個連結串列:
在節點 c1 開始相交。
注意:
如果兩個連結串列沒有交點,返回 null.
在返回結果後,兩個連結串列仍須保持原有的結構。
可假定整個連結串列結構中沒有迴圈。
程式儘量滿足 O(n) 時間複雜度,且僅用 O(1) 記憶體。
思路:
雙指標法
建立兩個指標 pA 和 pB,分別初始化為連結串列 A 和 B 的頭結點。然後讓它們向後逐結點遍歷。當 pA 到達連結串列的尾部時,將它重定位到連結串列 B 的頭結點; 類似的,當 pB 到達連結串列的尾部時,將它重定位到連結串列 A 的頭結點。若在某一時刻 pA 和 pB 相遇,則 pA/pB 為相交結點。pA 和 pB 兩個指標走的長度都為 len_A + len_B。如果兩個連結串列存在相交,它們必會走過一段相同的路程,也就是說他們的末尾的結點必然相同。因此當 pA/pB 到達連結串列結尾時,記錄下連結串列 A/B 對應的元素。若最後元素不相同,則兩個連結串列不相交。
程式碼:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { ListNode *a = headA, *b = headB;if(!a||!b) return NULL; while(a||b) { if(a==b) return a; if(!a->next&&b->next) { a = headB; b = b->next; } else if(a->next&&!b->next) { a= a->next; b = headA; } else if(!a->next&&!b->next) return NULL; else { a = a->next; b = b->next; } } return NULL; } };