Skip to content

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

一、问题描述

给定一个已排序的链表的头 head ,删除所有重复的元素,使每个元素只出现一次。返回已排序的链表。

示例 1

Image

输入:head = [1,1,2]
输出:[1,2]

示例 2

Image

输入:head = [1,1,2,3,3]
输出:[1,2,3]

提示

  • 链表中节点数目在范围 [0, 300]
  • -100 <= Node.Val <= 100
  • 链表已按升序排列

二、方案一:迭代法

1、思路

由于链表已排序,因此可以通过迭代的方式删除重复元素。用一个指针遍历链表,当发现当前节点的值与下一个节点的值相同时,就删除下一个节点。

2、代码实现

go
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func deleteDuplicates(head *ListNode) *ListNode {
    // 初始化当前指针为链表头部
    current := head

    // 遍历链表,直到当前指针为nil或当前指针的下一个指针为nil
    for current != nil && current.Next != nil {
        // 检查当前节点的值是否与下一个节点的值相同
        if current.Val == current.Next.Val {
            // 如果相同,删除下一个节点(即跳过下一个节点)
            current.Next = current.Next.Next
        } else {
            // 如果不同,移动当前指针到下一个节点
            current = current.Next
        }
    }
    // 返回处理后的链表头部
    return head
}

3、复杂度分析

  • 时间复杂度:O(n),其中 n 是链表的长度。
  • 空间复杂度:O(1),只需要常数级别的额外空间。

三、总结

方案时间复杂度空间复杂度备注
迭代法O(n)O(1)直接在链表上进行操作

迭代法是解决这个问题的有效方法,因为它直接在链表上进行操作,不需要额外的空间。在实际应用中,这是解决此类问题的首选方法。

木川工作室 (微信:mcmc2024)