-
[LeetCode] Remove Duplicates from Sorted List II알고리즘 2022. 5. 4. 19:16
82.Remove Duplicates from Sorted List II
각 노드가 나오는 갯수와, 각 노드를 dictionary 에 넣은 뒤에 key 값을 사용하여 비교하는 방법이다.
하지만, dictionary 는 파이썬에서는 key 가 들어간 순서가 보장되긴 하지만, 원래는 순서가 보장되지 않는 자료구조이기때문에, 이와같이 링크드 리스트에 사용하기에는 어울리지 않는다.
time O(2 * N)
space O(2 * N)# 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]: nodeDic = dict() cntDic = dict() curr = head while (curr): cntDic[curr.val] = cntDic.get(curr.val, 0) + 1 if (curr.val not in nodeDic): nodeDic[curr.val] = curr curr = curr.next start = None link = None for key in cntDic: if cntDic[key] == 1: if (start == None): link = nodeDic[key] start = nodeDic[key] else: link.next = nodeDic[key] link = nodeDic[key] else: continue if (link and link.next): link.next = None return start
그럼 다른 방법은 뭐가 있을까 ?
바로 반복문을 활용해 연결하는 방법이다.
사실 이 방법은 항상 헷갈린다.
그래서 마지막 노드와 처음 노드에 대한 예외처리를 잘 해주어야한다.
time O(N)
space O(1)# 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]: pre = ListNode(0) r = pre r.next = head curr = head while (curr and curr.next): if (curr.val != curr.next.val): pre.next = curr pre = curr curr = curr.next else: while (curr.next and curr.val == curr.next.val): curr = curr.next curr = curr.next return r.next
'알고리즘' 카테고리의 다른 글
[LeetCode] Shortest Path in Binary Matrix 풀이 (Python) (0) 2022.05.06 [LeetCode] Backspace String Compare (0) 2022.05.04 [LeetCode] Search in Rotated Sorted Array (0) 2022.05.04 [LeetCode] Single Number (0) 2022.05.03 [LeetCode] Reverse Bits (0) 2022.05.03