82. 删除排序链表中的重复元素 II
查看题目中等
链表
排序
中频
解法一:迭代法
时间复杂度:O(n) | 空间复杂度:O(1) | 推荐使用
动画演示
删除排序链表中的重复元素 II
当前步骤: 0 | 状态: 已暂停 | 链表长度: 0
dummy
→null
操作日志
算法说明
迭代算法:使用双指针遍历链表,检测并删除所有重复元素,只保留不重复的节点。
- 时间复杂度:O(n) - 只需遍历一次链表
- 空间复杂度:O(1) - 只使用常数级额外空间
- 关键思想:使用哑节点处理头节点可能被删除的情况
- 指针移动:prev指向当前确定不重复的节点,curr遍历链表
代码实现
class Solution {
public ListNode deleteDuplicates(ListNode head) {
// 创建哑节点,方便处理头节点可能被删除的情况
ListNode dummy = new ListNode(0);
dummy.next = head;
// prev指向当前确定不重复的节点
ListNode prev = dummy;
// curr遍历链表
ListNode curr = head;
while (curr != null) {
// 检查当前节点是否有重复
boolean isDuplicate = false;
while (curr.next != null && curr.val == curr.next.val) {
isDuplicate = true;
curr = curr.next;
}
if (isDuplicate) {
// 如果有重复,跳过所有重复节点
prev.next = curr.next;
} else {
// 如果没有重复,prev移动到当前节点
prev = prev.next;
}
// curr继续前进
curr = curr.next;
}
return dummy.next;
}
}时间复杂度:O(n)
空间复杂度:O(1)