-
Notifications
You must be signed in to change notification settings - Fork 0
/
code82RemoveDuplicatesfromSortedListII.py
58 lines (48 loc) · 1.78 KB
/
code82RemoveDuplicatesfromSortedListII.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
"""
82 Remove Duplicates from Sorted List II
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
For example,
Given 1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return 2->3.
"""
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
# The basic idea is to use a temporary node to save the "candidate" ListNode on the first time seeing a different value.
# Then we set this temporary node to None if duplicated num is seen. The next time we see a different value node, we will check this temporary node, if it is not None, we will link it.
from ListNode import *
class Solution(object):
def deleteDuplicates(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if not head or head.next is None:
return head
pre = ListNode(0)
pre.next = head
num = head.val
left, right, node = pre, head.next, head # node is the candidate ListNode to be linked to left
while right:
if right.val == num:
node = None
else:
if node:
left.next = node
left = left.next
node = right
num = right.val
right = right.next
if node: # bug fixed here: forgot the remaining node when "while" loop ends
left.next = node
node.next = None
else:
left.next = None
return pre.next
obj = Solution()
l1 = ListNode(0)
l1.fromList([1,1,2,2,3])
l2 = obj.deleteDuplicates(l1)
PrintLinkedList(l2)