# LeetCode Easy 160. Intersection of Two Linked Lists
tags: leetcode
問題
アイデア
「2つの単一方向リストの共通部分がどこノードから始まるのかを探せ」という問題です.
普通に1つ1つノードを辿っていけば良いでしょう.
解法
- 2つのリストをそれぞれ
A
,B
とします. - この際,それぞれのリストの参照するノードを
curA
,curB
とします. - まず,
curA
が終端に至ったら,B
の先頭に繋げます.同様にcurB
が終端に至ったら,A
の先頭に繋げます. - そして,
curA == curB
になった際のノードが答えです.
Floyd's cycleを利用した解答です.
計算量
リストのノードの数をそれぞれN
,M
とします.
- 時間計算量
- $O(N + M)$
- 空間計算量
- $O(1)$
C++
/** * 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 curA = headA, curB = headB; auto isCycledA = false, isCycledB = false; while (curA && curB) { if (curA == curB) return curA; curA = curA->next; if (!isCycledA && !curA) { curA = headB; isCycledA = true; } curB = curB->next; if (!isCycledB && !curB) { curB = headA; isCycledB = true; } } return NULL; } };