diff --git a/arai60/remove_duplicates_from_sorted_list/phase1.py b/arai60/remove_duplicates_from_sorted_list/phase1.py new file mode 100644 index 0000000..e4a6624 --- /dev/null +++ b/arai60/remove_duplicates_from_sorted_list/phase1.py @@ -0,0 +1,15 @@ +# 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 = head + while head: + while head.next and head.val == head.next.val: + head.next = head.next.next + head = head.next + return dummy_head + + \ No newline at end of file diff --git a/arai60/remove_duplicates_from_sorted_list/phase2.py b/arai60/remove_duplicates_from_sorted_list/phase2.py new file mode 100644 index 0000000..7ec0094 --- /dev/null +++ b/arai60/remove_duplicates_from_sorted_list/phase2.py @@ -0,0 +1,35 @@ +""" +Reference: +Ryotaro25: https://github.com/Ryotaro25/leetcode_first60/pull/3/files phase1の新しくListNodeを制作して末端の値と等しくなければ飛ばすコードを真似して書いてみた +kagetora0924: https://github.com/kagetora0924/leetcode-grind/pull/6/files 自分のphase1の方が状態管理する変数が少なくて頭のメモリをあまり消費しなくて良い気がした +fhiyo: https://github.com/fhiyo/leetcode/pull/3/files 重複ノード削除を関数にしていた。自分のコードにもせめてコメントぐらいは書くべきだと思い追記 +""" + +# Ryotaroさんのコードを参考に制作, 新しくListNodeを作るやり方 +class Solution: + def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]: + if head is None: + return head + + dummy_head = ListNode(-1) + dummy_head.next = ListNode(head.val) + sentinel = dummy_head.next + head = head.next + while head: + if head.val != sentinel.val: + sentinel.next = ListNode(head.val) + sentinel = sentinel.next + head = head.next + return dummy_head.next + +class Solution: + def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]: + dummy_head = head + while head: + while head.next and head.val == head.next.val: + # reconnect listnodes in order to delete duplicate ones. + head.next = head.next.next + head = head.next + return dummy_head + + \ No newline at end of file diff --git a/arai60/remove_duplicates_from_sorted_list/phase3.py b/arai60/remove_duplicates_from_sorted_list/phase3.py new file mode 100644 index 0000000..f34d41c --- /dev/null +++ b/arai60/remove_duplicates_from_sorted_list/phase3.py @@ -0,0 +1,11 @@ +class Solution: + def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]: + dummy_head = head + while head: + while head.next and head.val == head.next.val: + # recconect listnodes in order to delete duplicates + head.next = head.next.next + head = head.next + return dummy_head + + \ No newline at end of file diff --git a/arai60/remove_duplicates_from_sorted_list/phase4.py b/arai60/remove_duplicates_from_sorted_list/phase4.py new file mode 100644 index 0000000..962acc1 --- /dev/null +++ b/arai60/remove_duplicates_from_sorted_list/phase4.py @@ -0,0 +1,27 @@ +class Solution: + def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]: + node = head + while node: + while node.next and node.val == node.next.val: + node.next = node.next.next + node = node.next + return head + +# 再帰version +class Solution: + def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]: + node = head + def deleteDuplicatesNodes(node: Optional[ListNode]) -> None: + # nodeより先の重複したノードを返す + if node == None: + return None + if node.next and node.val == node.next.val: + node.next = node.next.next + return deleteDuplicatesNodes(node) + elif node.next is None: + return deleteDuplicatesNodes(None) + else: + return deleteDuplicatesNodes(node.next) + deleteDuplicatesNodes(node) + return head +