题⽬描述
在⼀个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 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)