链表简单1 种解法
#83删除排序链表中的重复元素
压缩有序链表中的连续重复值,使每个值只保留一个节点。
#链表
解题主线
01
重复值在有序链表中必然相邻,比较当前节点与 next 即可。
02
遇到重复节点时绕过 next;遇到新值时才推进当前指针。
解法 1:相邻节点去重
利用链表有序的条件,一次遍历删除与当前节点同值的直接后继。
时间复杂度
O(n)
空间复杂度
O(1)
java
public class Solution {
static final class ListNode {
int val;
ListNode next;
ListNode(int val) { this.val = val; }
}
public ListNode deleteDuplicates(ListNode head) {
ListNode current = head;
while (current != null && current.next != null) {
if (current.val == current.next.val) {
current.next = current.next.next;
} else {
current = current.next;
}
}
return head;
}
}利用链表有序的条件,一次遍历删除与当前节点同值的直接后继。
- 这是对旧 HashSet 实现的等价优化:时间仍为 O(n),额外空间降为 O(1)。
边界与易错点
- 旧文件用 HashSet 判断重复,结果正确但忽略了有序性并额外消耗 O(n) 空间。
- 本题每个值保留一个节点,与第 82 题删除整组重复值不同。
整理来源
由旧仓库源码复核、去重并整理;展示代码已按 Java 21 语义修正明显问题。
Q082_linkedList_delDuplicates.java