From 9b042046b61e281236c82a9e7e798a475e21f86b Mon Sep 17 00:00:00 2001 From: Atsutoshi-Honda Date: Sun, 5 Apr 2026 01:30:53 +0900 Subject: [PATCH 1/3] init --- .../memo.md | 8 +++++++ .../step1.py | 21 +++++++++++++++++++ .../step2.py | 19 +++++++++++++++++ .../step3.py | 17 +++++++++++++++ 4 files changed, 65 insertions(+) create mode 100644 82. Remove Duplicates from Sorted List II/memo.md create mode 100644 82. Remove Duplicates from Sorted List II/step1.py create mode 100644 82. Remove Duplicates from Sorted List II/step2.py create mode 100644 82. Remove Duplicates from Sorted List II/step3.py diff --git a/82. Remove Duplicates from Sorted List II/memo.md b/82. Remove Duplicates from Sorted List II/memo.md new file mode 100644 index 0000000..fdcf1ef --- /dev/null +++ b/82. Remove Duplicates from Sorted List II/memo.md @@ -0,0 +1,8 @@ +step1: +まず順番にノードを探索していって、head.valがhead.next.valと一致していればそれは重複したノードなのでそれらが消えるまでheadを進めていく。もしhead.valがhead.next.valでなければそれはdistinctなので答えで返すnodeとして追加するという方針で行く。しかし返すべき値をresとしてどのようにres自身に代入するか迷ったので、get_distinct_listという帰納関数を作りボトムアップでdistinctな連結リストを得て返すという方法を取った。 + +step2: +get_distinct_listがやっていることとdeleteDuplicatesがやってることが同じだと気づいたのでdeleteDuplicates内でのget_distinct_listの宣言をやめてdeleteDuplicatesの帰納的呼び出しを行うことにした。 + +step3: +duplicateだった場合に最後head = head.nextとやってるがそのままhead.nextを代入すればいいと気づいたのでhead = head.nextを消した。 \ No newline at end of file diff --git a/82. Remove Duplicates from Sorted List II/step1.py b/82. Remove Duplicates from Sorted List II/step1.py new file mode 100644 index 0000000..16c4e66 --- /dev/null +++ b/82. Remove Duplicates from Sorted List II/step1.py @@ -0,0 +1,21 @@ +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, val=0, next=None): +# self.val = val +# self.next = next +class Solution: + def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]: + + def get_distinct_list(head_arg): + if not head_arg or not head_arg.next: + return head_arg + if head_arg.val == head_arg.next.val: + while head_arg.next and head_arg.val == head_arg.next.val: + head_arg = head_arg.next + head_arg = head_arg.next + return get_distinct_list(head_arg) + + head_arg.next = get_distinct_list(head_arg.next) + return head_arg + + return get_distinct_list(head) \ No newline at end of file diff --git a/82. Remove Duplicates from Sorted List II/step2.py b/82. Remove Duplicates from Sorted List II/step2.py new file mode 100644 index 0000000..930c8f8 --- /dev/null +++ b/82. Remove Duplicates from Sorted List II/step2.py @@ -0,0 +1,19 @@ +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, val=0, next=None): +# self.val = val +# self.next = next +class Solution: + def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]: + + if not head or not head.next: + return head + + if head.val == head.next.val: + while head.next and head.val == head.next.val: + head = head.next + head = head.next + return self.deleteDuplicates(head) + + head.next = self.deleteDuplicates(head.next) + return head diff --git a/82. Remove Duplicates from Sorted List II/step3.py b/82. Remove Duplicates from Sorted List II/step3.py new file mode 100644 index 0000000..6b2c3d9 --- /dev/null +++ b/82. Remove Duplicates from Sorted List II/step3.py @@ -0,0 +1,17 @@ +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, val=0, next=None): +# self.val = val +# self.next = next +class Solution: + def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]: + if not head or not head.next: + return head + + if head.val == head.next.val: + while head.next and head.val == head.next.val: + head = head.next + return self.deleteDuplicates(head.next) + + head.next = self.deleteDuplicates(head.next) + return head \ No newline at end of file From 5ba9307a294a4ba95209cea679a742dfddd2b219 Mon Sep 17 00:00:00 2001 From: Atsutoshi-Honda Date: Sun, 5 Apr 2026 12:55:56 +0900 Subject: [PATCH 2/3] =?UTF-8?q?markdown=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../memo.md | 68 ++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/82. Remove Duplicates from Sorted List II/memo.md b/82. Remove Duplicates from Sorted List II/memo.md index fdcf1ef..1868726 100644 --- a/82. Remove Duplicates from Sorted List II/memo.md +++ b/82. Remove Duplicates from Sorted List II/memo.md @@ -5,4 +5,70 @@ step2: get_distinct_listがやっていることとdeleteDuplicatesがやってることが同じだと気づいたのでdeleteDuplicates内でのget_distinct_listの宣言をやめてdeleteDuplicatesの帰納的呼び出しを行うことにした。 step3: -duplicateだった場合に最後head = head.nextとやってるがそのままhead.nextを代入すればいいと気づいたのでhead = head.nextを消した。 \ No newline at end of file +duplicateだった場合に最後head = head.nextとやってるがそのままhead.nextを代入すればいいと気づいたのでhead = head.nextを消した。 + +## step1: +まず順番にノードを探索していって、head.valがhead.next.valと一致していればそれは重複したノードなのでそれらが消えるまでheadを進めていく。もしhead.valがhead.next.valでなければそれはdistinctなので答えで返すnodeとして追加するという方針で行く。しかし返すべき値をresとしてどのようにres自身に代入するか迷ったので、get_distinct_listという帰納関数を作りボトムアップでdistinctな連結リストを得て返すという方法を取った。 + +### code +```python +class Solution: + def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]: + + def get_distinct_list(head_arg): + if not head_arg or not head_arg.next: + return head_arg + if head_arg.val == head_arg.next.val: + while head_arg.next and head_arg.val == head_arg.next.val: + head_arg = head_arg.next + head_arg = head_arg.next + return get_distinct_list(head_arg) + + head_arg.next = get_distinct_list(head_arg.next) + return head_arg + + return get_distinct_list(head) +``` + +## step2: +get_distinct_listがやっていることとdeleteDuplicatesがやってることが同じだと気づいたのでdeleteDuplicates内でのget_distinct_listの宣言をやめてdeleteDuplicatesの帰納的呼び出しを行うことにした。 + +### code +```python +class Solution: + def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]: + + if not head or not head.next: + return head + + if head.val == head.next.val: + while head.next and head.val == head.next.val: + head = head.next + head = head.next + return self.deleteDuplicates(head) + + head.next = self.deleteDuplicates(head.next) + return head + +``` + + +## step3: +duplicateだった場合に最後head = head.nextとやってるがそのままhead.nextを代入すればいいと気づいたのでhead = head.nextを消した。 + +### code +```python +class Solution: + def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]: + if not head or not head.next: + return head + + if head.val == head.next.val: + while head.next and head.val == head.next.val: + head = head.next + return self.deleteDuplicates(head.next) + + head.next = self.deleteDuplicates(head.next) + return head + +``` \ No newline at end of file From 52b9dc21b7bbb35a95a3e82f97ddceaac598f393 Mon Sep 17 00:00:00 2001 From: Atsutoshi-Honda Date: Sun, 5 Apr 2026 12:57:04 +0900 Subject: [PATCH 3/3] =?UTF-8?q?=E4=B8=8D=E8=A6=81=E3=81=AA=E3=81=AE?= =?UTF-8?q?=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 82. Remove Duplicates from Sorted List II/memo.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/82. Remove Duplicates from Sorted List II/memo.md b/82. Remove Duplicates from Sorted List II/memo.md index 1868726..7ae7ce9 100644 --- a/82. Remove Duplicates from Sorted List II/memo.md +++ b/82. Remove Duplicates from Sorted List II/memo.md @@ -1,11 +1,3 @@ -step1: -まず順番にノードを探索していって、head.valがhead.next.valと一致していればそれは重複したノードなのでそれらが消えるまでheadを進めていく。もしhead.valがhead.next.valでなければそれはdistinctなので答えで返すnodeとして追加するという方針で行く。しかし返すべき値をresとしてどのようにres自身に代入するか迷ったので、get_distinct_listという帰納関数を作りボトムアップでdistinctな連結リストを得て返すという方法を取った。 - -step2: -get_distinct_listがやっていることとdeleteDuplicatesがやってることが同じだと気づいたのでdeleteDuplicates内でのget_distinct_listの宣言をやめてdeleteDuplicatesの帰納的呼び出しを行うことにした。 - -step3: -duplicateだった場合に最後head = head.nextとやってるがそのままhead.nextを代入すればいいと気づいたのでhead = head.nextを消した。 ## step1: まず順番にノードを探索していって、head.valがhead.next.valと一致していればそれは重複したノードなのでそれらが消えるまでheadを進めていく。もしhead.valがhead.next.valでなければそれはdistinctなので答えで返すnodeとして追加するという方針で行く。しかし返すべき値をresとしてどのようにres自身に代入するか迷ったので、get_distinct_listという帰納関数を作りボトムアップでdistinctな連結リストを得て返すという方法を取った。