diff --git a/82_Rmove_Duplicates_from_Sorted_List_II/note.md b/82_Rmove_Duplicates_from_Sorted_List_II/note.md new file mode 100644 index 0000000..96a20c6 --- /dev/null +++ b/82_Rmove_Duplicates_from_Sorted_List_II/note.md @@ -0,0 +1,44 @@ +# 82. Remove Duplicates from Sorted List II + + + +## step1(まず通す) + +「次とその次を見て、値が重複していたらその値を覚えておき、ちがう値が出てくるまで次を繋ぎ替え続ける。重複してなかったら一つ進む」という考え方。スタートから重複する可能性もあるのでhead の前にダミーヘッドを用意してheadから重複判定を開始する必要がある。ダミーヘッドは本当の head と値が重複しないように `-100 <= Node.val <= 100` の外である必要がある。 + +## step2(整形&他の人のコードを読む) + +`does_duplicate_start` は条件分岐があってかつ return が False, True, False と並ぶのは認知不可高そう。`is None` だと長くなるが、単に `node` とか書けば短いので True になる条件一つ vs. その他は False の方がいいかも。 + +本体の方で、while のあとに if が来て処理が長い→else は短い処理なので、if の判定を入れ替えた方がいいかも。↑のコメントも T と F が入れ替わる形で。 + +変数名に略語を使うかどうかは流派によるだろうが、今回は関数名にも duplicate があるのでdup_val でもわかりそうと思いつつ、エディタが補完してくれるので略さずに書けというのもわかる。 + +いつ仕様が変わるかわからないのでマジックナンバー避けるべしというのも納得: + +if else で書くか if の中で continue して else の方は外で書くかだが、今回はネストが深くない方がいいので continue かな。 + +と思ったが、そもそも is_unique を関数化する意味が薄い気がして来た。関数の中身が一つの if else だけなので。そうなると、条件に否定がない方が見やすいと思うので結局元と同じ順番に戻った。 + +-1000 がマジックナンバーになっておりよくないので、 float("-inf") にしてみた。マイナスなのは、一応ソートされてて欲しいので。一応 int vs. float の型の違いはあるが int の最大みたいなのはないので一旦これで。 + +## step3(10分以内にさっとかける * 3回) + +node.next が None ならその先を見る意味もないので↓でもいいかもしれない。 + +```python +class Solution: + def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]: + dummy_head = ListNode(val=float("-inf"), next=head) + node = dummy_head + while node.next: + if node.next.next and node.next.val == node.next.next.val: + duplicate_value = node.next.val + while node.next and node.next.val == duplicate_value: + node.next = node.next.next + else: + node = node.next + + return dummy_head.next + +``` diff --git a/82_Rmove_Duplicates_from_Sorted_List_II/step1.py b/82_Rmove_Duplicates_from_Sorted_List_II/step1.py new file mode 100644 index 0000000..417f3e9 --- /dev/null +++ b/82_Rmove_Duplicates_from_Sorted_List_II/step1.py @@ -0,0 +1,30 @@ +from typing import Optional + + +# Definition for singly-linked list. +class ListNode: + def __init__(self, val=0, next=None): + self.val = val + self.next = next + + +class Solution: + def does_duplicate_start(self, node: Optional[ListNode]) -> bool: + if node is None or node.next is None: + return False + if node.val == node.next.val: + return True + return False + + def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]: + dummy_head = ListNode(val=-1000, next=head) + node = dummy_head + while node is not None: + if self.does_duplicate_start(node.next): + dup_val = node.next.val + while node.next and node.next.val == dup_val: + node.next = node.next.next + else: + node = node.next + + return dummy_head.next diff --git a/82_Rmove_Duplicates_from_Sorted_List_II/step2.py b/82_Rmove_Duplicates_from_Sorted_List_II/step2.py new file mode 100644 index 0000000..4e55799 --- /dev/null +++ b/82_Rmove_Duplicates_from_Sorted_List_II/step2.py @@ -0,0 +1,23 @@ +from typing import Optional + + +# 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]: + dummy_head = ListNode(val=float("-inf"), next=head) + node = dummy_head + while node: + if node.next and node.next.next and node.next.val == node.next.next.val: + duplicate_value = node.next.val + while node.next and node.next.val == duplicate_value: + node.next = node.next.next + else: + node = node.next + + return dummy_head.next diff --git a/82_Rmove_Duplicates_from_Sorted_List_II/step3.py b/82_Rmove_Duplicates_from_Sorted_List_II/step3.py new file mode 100644 index 0000000..4e55799 --- /dev/null +++ b/82_Rmove_Duplicates_from_Sorted_List_II/step3.py @@ -0,0 +1,23 @@ +from typing import Optional + + +# 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]: + dummy_head = ListNode(val=float("-inf"), next=head) + node = dummy_head + while node: + if node.next and node.next.next and node.next.val == node.next.next.val: + duplicate_value = node.next.val + while node.next and node.next.val == duplicate_value: + node.next = node.next.next + else: + node = node.next + + return dummy_head.next