1. 程式人生 > 實用技巧 >LeetCode160. 相交連結串列

LeetCode160. 相交連結串列


這題做法比較賊,讓兩個指標p, q分別指向兩個連結串列的頭,然後只要兩個指標不為空且指向的位置不同,就都向後移動,當一個指標為空的時候,就指向另一個連結串列的頭。

比如上面這圖,假設相交部分之前,兩個連結串列的長度分別是a,b,相交連結串列之後的長度為c。

那麼p指標走了a + c長度(走完第一個連結串列)之後,指向第二個連結串列頭headB;
q指標走了b + c長度(走完第二個連結串列)之後,指向第一個連結串列頭headA。

然後兩個指標又分別走了b和a的長度,最終,在經過a + b + c之後,兩個指標終於相遇了。
這是兩個連結串列有交點的情況。

如果兩個連結串列沒有交點,這種走法也是成立的。

比如上圖,p走完第一個連結串列(經過a步),走到了第二個連結串列頭headB;q走完第二個連結串列(經過b步),走到了第一個連結串列頭headA。
然後它們右各自走了b步和a步,都到了NULL,注意,是NULL哦,兩個指標都指向NULL了,也可以認為指向相同的位置,所以返回值是p(或者q也行,反正都是NULL)。

程式碼如下:

/**
 * 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) {
        auto p = headA, q = headB;
        while(p != q) {
            if(p != NULL) {
                p = p -> next;
            } else {
                p = headB;
            }
            if(q != NULL) {
                q = q -> next;
            } else {
                q = headA;
            }
        }
        return p;
    }
};