Python
 Computer >> コンピューター >  >> プログラミング >> Python

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」を持つノードで合流します。

解法のアプローチ

この問題は、ハッシュマップ(辞書)を使うことで効率的に解決できます。手順は以下の通りです。

  1. 空の辞書 d を定義します。
  2. headA が null でない間、以下を繰り返します。
    • d[headA] := 1 としてノードを記録
    • headA := headA の次のノードへ移動
  3. headB が null でない間、以下を繰り返します。
    • もし headB が d に存在すれば、headB を返す(これが交差ノード)
    • そうでなければ headB := headB の次のノードへ移動
  4. 最後まで見つからなければ 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」を持つノードで交差していることが確認できます。ハッシュマップによるノードの記録と照合により、交差ノードを正確に特定できるのがポイントです。

  1. Javaで2つの連結リストの交点を見つける方法

    連結リスト(Linked List)は、各ノードが2つのブロックで構成される線形データ構造です。一方のブロックにはノードの値(データ)が格納され、もう一方のブロックには次のノードへのアドレス(ポインタ)が格納されます。ここでは、2つの連結リストが交差するノードを見つける問題を扱います。2つのリストが共通のノードを持つ場合、その交点となるノードを特定します。交点が存在しない場合は、NULL(または空)を出力として返します。具体例入力1:出力:2説明: 与えられた連結リストは値「2」のノードで交差しているため、出力として「2」を返します。入力2:出力:NULL説明: 共通のノードが存在しないため、

  2. Pythonで連結リストを使って2つの多項式を加算するプログラムの作り方

    問題の概要 この記事では、連結リストで表現された2つの多項式を加算するPythonプログラムを紹介します。 2つの多項式が与えられ、それらの和を求めることを考えます。多項式は連結リストとして表現し、多項式の各項は連結リストの1つのノードに対応させます。各ノードには「係数」「次数(べき指数)」、そして「次のノードへの参照(ポインタ)」を持たせます。最終的なゴールは、2つの多項式の和を表す新しい連結リストを返すことです。 たとえば、入力が以下の画像のような2つの多項式だった場合を見てみましょう。 1x^1 + 1x^2 = 0 と 2x^1 + 3x^0 = 0 この場合、出力は次のようになりま