原题
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
Example 1:
Input: 1->2->3->3->4->4->5
Output: 1->2->5
Example 2:
Input: 1->1->1->2->3
Output: 2->3
解法1
双指针法, 定义虚拟节点dummy, dummy.next指向head, 定义两个指针prev, cur, 遍历链表, 如果出现重复值, 那么cur一直走到最后一个重复值的位置, prev越过cur, 即prev.next = cur.next, 如果没有重复值, 则prev和cur都前进一步, 最终返回dummy.next
Time: O(n)
Space: O(1)
代码
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def deleteDuplicates(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
dummy = ListNode(0)
dummy.next = head
prev, cur = dummy, dummy.next
while cur:
while cur.next and cur.next.val == cur.val:
cur = cur.next
if prev.next == cur:
# move prev node to the next node
prev = prev.next
else:
prev.next = cur.next
cur = cur.next
return dummy.next
解法2
将链表里的不重复的值放入列表, 然后遍历列表, 构造链表.
代码
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def deleteDuplicates(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
l = []
while head:
if head.val not in l:
l.append(head.val)
else:
l.remove(head.val)
# skip the same val
while head.next and head.next.val == head.val:
head = head.next
head = head.next
dummy = p = ListNode(0)
for val in l:
p.next = ListNode(val)
p = p.next
return dummy.next