删除排序链表中的重复元素

题目 - Remove Duplicates From Sorted List

LeetCode-83

面试题 02.01

难度:简单

分析

直接法

这是一个简单的问题,仅测试你操作列表的结点指针的能力。由于输入的列表已排序,因此我们可以通过将结点的值与它之后的结点进行比较来确定它是否为重复结点。如果它是重复的,我们更改当前结点的 next 指针,以便它跳过下一个结点并直接指向下一个结点之后的结点。

set去重

通过 HashSet 来存储所有出现过的节点

代码

直接法

func deleteDuplicates(_ head: ListNode?) -> ListNode? {
    var current = head
    while current != nil && current!.next != nil {
        if current?.val == current?.next!.val {
            current?.next = current?.next?.next
        }else {
            current = current!.next
        }
    }
    
    return head
}

set 去重


func removeDuplicateNodes(_ head: ListNode?) -> ListNode? {
    guard let head = head else {
        return nil
    }
    
    var map: [Int: ListNode] = [:]
    var p = head
    map[p.val] = p
    while p.next != nil {
        if map[p.next!.val] != nil {
            p.next = p.next!.next
        }else {
            map[p.next!.val] = p.next!
            p = p.next!
        }
    }
    
    return head
}