题⽬描述

在⼀个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5

示例1 输⼊:{1,2,3,3,4,4,5} 返回值:{1,2,5}

思路及解答

hash统计

第一次遍历统计频率,第二次遍历删除重复节点

  • 时间复杂度:O(n)

  • 空间复杂度:O(n)

直接遍历(推荐)

注意,题目已经提到是排序的节点,那么就可以直接原地删除

对⽐前后两个元素,如果相同的情况下,接着遍历后⾯的元素,直到元素不相等的时候,将前⾯的指针指向最后⼀个相同的元素的后⾯,相当于跳过了相同的元素。

  • 空间复杂度为 O(1),没有借助额外的空间

  • 时间复杂度为 O(n),只遍历了⼀次链表

递归

将大问题分解为当前节点+剩余链表的子问题

  • 时间复杂度:O(n)

  • 空间复杂度:O(n),递归栈空间

三指针法

使用pre、cur、next三个指针精确控制删除范围

  • 时间复杂度:O(n)

  • 空间复杂度:O(1)