LeetCode160. 相交連結串列
阿新 • • 發佈:2020-07-31
這題做法比較賊,讓兩個指標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; } };