链表简单1 种解法

#83删除排序链表中的重复元素

压缩有序链表中的连续重复值,使每个值只保留一个节点。

#链表

解题主线

01

重复值在有序链表中必然相邻,比较当前节点与 next 即可。

02

遇到重复节点时绕过 next;遇到新值时才推进当前指针。

解法 1相邻节点去重

利用链表有序的条件,一次遍历删除与当前节点同值的直接后继。

时间复杂度

O(n)

空间复杂度

O(1)

83. 删除排序链表中的重复元素 · 相邻节点去重
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