🔥

160. Intersection of Two Linked Lists

に公開

2つの単方向連結リスト headAheadB の先頭ノードが与えられたとき、それらが交差しているノードを返してください。2つの連結リストが全く交差しない場合は null を返してください。

例えば、以下の2つの連結リストはノード c1 で交差を始めます:

(※図は省略)

テストケースは、連結構造の中にサイクルが一切存在しないように生成されています。

なお、関数が返された後も、連結リストの元の構造は保持されなければなりません。


カスタムジャッジについて:

ジャッジに与えられる入力は以下の通りです(あなたのプログラムにはこれらは与えられません):

  • intersectVal:交差が起きるノードの値。交差がない場合は 0。
  • listA:最初の連結リスト
  • listB:2番目の連結リスト
  • skipA:交差ノードに到達するために listA の先頭からスキップするノード数
  • skipB:交差ノードに到達するために listB の先頭からスキップするノード数

ジャッジはこれらの入力に基づいて連結構造を作成し、headAheadB の2つの先頭ノードをあなたのプログラムに渡します。正しく交差ノードを返せれば、解答は受理されます。


例1:

入力:
intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3
出力: '8' で交差'

説明:
交差しているノードの値は 8 です(交差していれば値は 0 ではありません)。
listA は [4,1,8,4,5]、listB は [5,6,1,8,4,5]
listA では交差ノードの前に2ノード、listB では3ノードあります。

※listAとlistBに同じ値を持つノード(例えば値1)があっても、メモリ上の参照が異なる場合、それらは異なるノードとみなされます。逆に、値8を持つノードは同じメモリアドレスを指しているので交差と見なされます。


例2:

入力:
intersectVal = 2, listA = [1,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
出力: '2' で交差'

説明:
交差ノードの値は 2。listA の3ノード目と listB の1ノード目で交差が始まります。


例3:

入力:
intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
出力: '交差なし'

説明:
listA は [2,6,4]、listB は [1,5] であり、交差はありません。よって intersectVal は 0 になります。


制約:

  • listA のノード数は m、listB のノード数は n
  • 1 <= m, n <= 3 * 10^4
  • 1 <= Node.val <= 10^5
  • 0 <= skipA <= m
  • 0 <= skipB <= n
  • intersectVal == 0 なら交差なし。
  • intersectVal == listA[skipA] == listB[skipB] であれば交差あり。

Discussion