Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions 142-linked-list-cycle-II/memo.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
## step1で考えたこと
前回の問題に、Cycleがあった場合にその地点のIndexを返す処理が増やされただけ

どうやってIndexを追うか => 何か追加で変数が必要?

slow == fastとなった後に何か行う

slowを追っていって、同じ数字が2回現れたNodeがCycleの開始地点と見做せる?

=> 同じ数字がNodeに二つあった時に壊れる?

そもそもListじゃないからIndexをどう追うか?

## step2
自分が書いたコードを貼って解説をGPTにしてもらったところ、問題文の読み間違えに気づいた。
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

このあたりの整え方を見ておいてください。

あ、私のしているコメントを GPT に放り込んでどう思うかなどを聞くのもいいです。
https://docs.google.com/document/d/11HV35ADPo9QxJOpJQ24FcZvtvioli770WWdZZDaLOfg/edit?tab=t.0#heading=h.9kpbwslvv3yv


Indexを返す必要はなかった。

elseの位置が違う。Noneを返すのは、slowとfastが出会わなかった時

whileの条件もisではなく、is not

isだと最初の時点でTrueになってしまう

## step3

### Linked List で is を使う理由

Cycle II で知りたいのは

「同じ値のノード」ではなく

「同じノード(同じメモリ上のノード)」に到達したか

なので is が正解です。

値が同じノードが2つあっても、それは別ノード

開始点は「特定の1ノード」なので同一性で判定する
25 changes: 25 additions & 0 deletions 142-linked-list-cycle-II/step1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# 動かないコード

# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None

class Solution:
def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
slow = head
fast = head
visited = []
visited.append(head)

while fast and fast.next:
slow = slow.next
fast = fast.next.next
visited.append(slow)

if slow == fast:
if slow in visited:
return

return None
28 changes: 28 additions & 0 deletions 142-linked-list-cycle-II/step2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# 動かないコード

# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None

class Solution:
def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
slow = head
fast = head

while fast and fast.next:
slow = slow.next
fast = fast.next.next

if slow is fast:
break

else:
return None

node = head
while node is slow:
node = node.next
slow = slow.next
return node
26 changes: 26 additions & 0 deletions 142-linked-list-cycle-II/step3.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None

class Solution:
def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
slow = head
fast = head

while fast and fast.next:
slow = slow.next
fast = fast.next.next

if slow == fast:
break
else: return None

entry = head

while entry is not slow:
entry = entry.next
slow = slow.next

return entry