83.删除排序链表中的重复元素
解题思路:双指针法
由于链表是 有序的,所以所有重复的元素必定是连续的。
我们可以使用双指针遍历链表,实现原地去重。
关键点:
-
使用两个指针
slow
和fast
:slow
指向不重复部分的尾部;fast
用来遍历查找下一个不重复元素;
-
每当
fast->val != slow->val
时,说明发现了新值:- 将
slow->next = fast
; - 然后
slow
往前移动一步;
- 将
-
最后确保链表的末尾指向
nullptr
,避免保留多余的重复节点。
代码实现(C++)
class Solution {
public:ListNode* deleteDuplicates(ListNode* head) {if(head == nullptr)return nullptr;ListNode* slow = head; ListNode* fast = head;while(fast != nullptr){if(fast->val != slow->val){slow->next = fast;slow = slow->next;}fast = fast->next;}// 断开重复部分slow->next = nullptr; return head;}
};
🧪 示例演示
输入链表:
1 -> 1 -> 2 -> 3 -> 3
执行过程:
- slow 指向第一个
1
; - fast 向前走,跳过重复的
1
; - fast 发现
2
,赋值给slow->next
,然后 slow 也往前走; - fast 跳过重复的
3
,最终 slow 的 next 设为nullptr
。
输出链表:
1 -> 2 -> 3
时间与空间复杂度分析
- 时间复杂度:
O(n)
,每个节点只遍历一次; - 空间复杂度:
O(1)
,使用常数空间,原地修改链表。