DeepSeek LeetCode 82. 删除排序链表中的重复元素 II Java实现

DeepSeek    LeetCode 82. 删除排序链表中的重复元素 II Java实现 LeetCode 82「删除排序链表中的重复元素 II」要求删除所有重复的节点只保留没有重复出现的数字。下面给出 Java 实现使用哑节点简化头节点处理。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val val; } * ListNode(int val, ListNode next) { this.val val; this.next next; } * } */classSolution{publicListNodedeleteDuplicates(ListNodehead){// 哑节点方便处理头节点可能被删除的情况ListNodedummynewListNode(0);dummy.nexthead;ListNodeprevdummy;// prev 始终指向已保留部分的最后一个节点ListNodecurrhead;// curr 为当前待检查的节点while(curr!null){// 如果当前节点与下一个节点值相同说明有重复if(curr.next!nullcurr.valcurr.next.val){intduplicateValcurr.val;// 跳过所有值为 duplicateVal 的节点while(curr!nullcurr.valduplicateVal){currcurr.next;}// 将 prev 的下一个节点指向第一个不同值的节点prev.nextcurr;}else{// 当前节点不重复保留它prev 和 curr 都前移prevcurr;currcurr.next;}}returndummy.next;}}思路说明· 使用哑节点 dummy 指向链表头prev 指向已处理部分的末尾初始为 dummy。· 遍历链表当发现当前节点 curr 与下一个节点值相同记录该重复值然后内层循环跳过所有等于该值的节点。· 跳过重复节点后prev.next 直接指向第一个值不同的节点即 curr但 prev 本身不移动因为需要继续检查新的 curr 是否重复。· 如果当前节点不重复则 prev 和 curr 均前移。· 最终返回 dummy.next即去重后的链表头。时间复杂度 O(n)空间复杂度 O(1)。