给定一个链表的第一个节点 head ,找到链表中所有出现多于一次的元素,并删除这些元素所在的节点。
返回删除后的链表。
示例 1:
输入: head = [1,2,3,2]
输出: [1,3]
解释: 2 在链表中出现了两次,所以所有的 2 都需要被删除。删除了所有的 2 之后,我们还剩下 [1,3] 。
示例 2:
输入: head = [2,1,1,2]
输出: []
解释: 2 和 1 都出现了两次。所有元素都需要被删除。
示例 3:
输入: head = [3,2,2,1,3,2,4]
输出: [1,4]
解释: 3 出现了两次,且 2 出现了三次。移除了所有的 3 和 2 后,我们还剩下 [1,4] 。
提示:
链表中节点个数的范围是 [1, 105]
1 <= Node.val <= 105
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-an-unsorted-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
两步走,
第一步从头到尾走一遍找出所有重复的节点,
第二步再走一遍删掉重复的节点。
时间复杂度:O(N)
空间复杂度:O(N)
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def deleteDuplicatesUnsorted(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
# find all elements to be deleted
visited = set()
repeated = set()
p = head
while p:
if p.val in visited:
repeated.add(p.val)
visited.add(p.val)
p = p.next
# delete all repeated elements
p = dummy = ListNode(-1)
dummy.next = head
while p and p.next:
if p.next.val in repeated:
p.next = p.next.next
else:
p = p.next
return dummy.next