LeetCode 160 - Intersection of Two Linked Lists
題目
題目連結:https://leetcode.com/problems/intersection-of-two-linked-lists/
給定兩個 Linked list,找出其交點。若沒有交點則回傳 null
。
範例說明
Example 1:
1 | Input: intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3 |
Example 2:
1 | Input: intersectVal = 2, listA = [1,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1 |
Example 3:
1 | Input: intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2 |
想法
想法一
首先,使用兩個指標,curA
從頭開始遍歷第一條 Linked list,curB
遍歷第二條。
找出第一條 Linked list 的長 lenA
以及第二條 Linked list 的長 lenB
。
因為兩條 Linked list 若有交點,則交點後的長度皆一樣。所以只要將長度較長的 Linked list 從開頭去掉 |lenA - lenB|
個點,使得兩個 Linked list 長度相等,使用兩個指標從兩個 Linked list 的開頭開始,同時一次一步的前進,若有交點則一定會同時走到交點;若沒有交點則同時走到 null
。
想法二
使用第一條 Linked list 串到第二條 Linked list 之後;將第二條 Linked list 串到第一條 Linked list 之後。則兩條 Linked list 會變成等長,根據想法一,因為交點後的長度皆相同,所以只要使用兩個指標從兩個 Linked list 的開頭開始,同時一次一步的前進,若有交點則一定會同時走到交點(下圖黑框):若沒有交點的話則同時走到 null
。
實作細節
下面實作為想法二。
實作時,可以判斷當 curA->next != nullptr
時,curA = headB
,否則 curA = curA->next
;curB
類似道理。
但是這樣實作會發現當沒有交點時,curA
與 curB
會無法同時走到 null
上(因為 curA
在走到 null
之前就會因為 curA->next != nullptr
而執行 curA = headB
走到 headB
上了。
可以將判斷條件改為 curA->next != nullptr
改為 curA != nullptr
,curB
也類似道理。這樣一來不但符合想法二,並且解決了上述的問題。
程式碼
1 | /** |