알고리즘
[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