Pythonで2つの連結リストの交差ノードを求める方法
ここでは、2つの連結リスト(リンクリスト)AとBが与えられ、それぞれにいくつかの要素が含まれている状況を考えます。このとき、両方のリストが交差しているノードへの参照を返す必要があります。
例として、次のような入力を扱います。
- intersectionVal = 8
- A = [4, 1, 8, 4, 5]
- B = [5, 0, 1, 8, 4, 5]
- skipA = 2
- skipB = 3
skipAとskipBは、それぞれリストAから2要素、リストBから3要素をスキップして交差ノードに到達することを示しています。つまり、両リストは値「8」を持つノードで合流します。
解法のアプローチ
この問題は、ハッシュマップ(辞書)を使うことで効率的に解決できます。手順は以下の通りです。
- 空の辞書 d を定義します。
- headA が null でない間、以下を繰り返します。
- d[headA] := 1 としてノードを記録
- headA := headA の次のノードへ移動
- headB が null でない間、以下を繰り返します。
- もし headB が d に存在すれば、headB を返す(これが交差ノード)
- そうでなければ headB := headB の次のノードへ移動
- 最後まで見つからなければ null を返します。
この方法では、まずリストAのすべてのノードを辞書に登録し、その後リストBを走査しながら「同じノードオブジェクト」が既に辞書に存在するかを確認します。値が同じでも別のノードオブジェクトであれば交差とはみなされない点が重要です。
計算量は時間 O(m + n)、空間 O(m)(m、nはそれぞれのリストの長さ)となります。
Pythonでの実装例
以下のコードで実際の動作を確認してみましょう。
class ListNode:
def __init__(self, data, next=None):
self.data = data
self.next = next
class Solution(object):
def getIntersectionNode(self, headA, headB):
"""
:type head1, head2: ListNode
:rtype: ListNode
"""
d = {}
while headA:
d[headA] = 1
headA = headA.next
while headB:
if headB in d:
return headB
headB = headB.next
return None
# リンクリストの構築
headA = ListNode(4)
headB = ListNode(5)
Intersect = ListNode(8, ListNode(4, ListNode(5)))
headA.next = ListNode(1, Intersect)
headB.next = ListNode(0, ListNode(1, Intersect))
ob1 = Solution()
op = ob1.getIntersectionNode(headA, headB)
print("Intersection:", op.data)
入力
headA = ListNode(4)
headB = ListNode(5)
Intersect = ListNode(8, ListNode(4, ListNode(5)))
headA.next = ListNode(1, Intersect)
headB.next = ListNode(0, ListNode(1, Intersect))
出力
Intersected at '8'
この結果から、リストAとリストBは値「8」を持つノードで交差していることが確認できます。ハッシュマップによるノードの記録と照合により、交差ノードを正確に特定できるのがポイントです。
-
Javaで2つの連結リストの交点を見つける方法
連結リスト(Linked List)は、各ノードが2つのブロックで構成される線形データ構造です。一方のブロックにはノードの値(データ)が格納され、もう一方のブロックには次のノードへのアドレス(ポインタ)が格納されます。ここでは、2つの連結リストが交差するノードを見つける問題を扱います。2つのリストが共通のノードを持つ場合、その交点となるノードを特定します。交点が存在しない場合は、NULL(または空)を出力として返します。具体例入力1:出力:2説明: 与えられた連結リストは値「2」のノードで交差しているため、出力として「2」を返します。入力2:出力:NULL説明: 共通のノードが存在しないため、
-
Pythonで連結リストを使って2つの多項式を加算するプログラムの作り方
問題の概要 この記事では、連結リストで表現された2つの多項式を加算するPythonプログラムを紹介します。 2つの多項式が与えられ、それらの和を求めることを考えます。多項式は連結リストとして表現し、多項式の各項は連結リストの1つのノードに対応させます。各ノードには「係数」「次数(べき指数)」、そして「次のノードへの参照(ポインタ)」を持たせます。最終的なゴールは、2つの多項式の和を表す新しい連結リストを返すことです。 たとえば、入力が以下の画像のような2つの多項式だった場合を見てみましょう。 1x^1 + 1x^2 = 0 と 2x^1 + 3x^0 = 0 この場合、出力は次のようになりま