1. 程式人生 > 資訊 >戴爾釋出全新超薄 Soundbar 條狀音箱:全球最薄最輕

戴爾釋出全新超薄 Soundbar 條狀音箱:全球最薄最輕

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

如下面的兩個連結串列

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