问题描述
LeetCode 82. 删除排序链表中的重复元素 II (opens in a new tab),难度中等。
给定一个已排序的链表的头 head
, 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
示例 1
输入:head = [1,2,3,3,4,4,5] 输出:[1,2,5]
示例 2
输入:head = [1,1,1,2,3] 输出:[2,3]
提示:
- 链表中节点数目在范围
[0, 300]
内 -100 <= Node.val <= 100
- 题目数据保证链表已经按升序 排列
题解
双指针
Solution.java
class Solution {
public ListNode deleteDuplicates(ListNode head) {
// head 为 null,直接返回
if (head == null) return head;
// 判断第一个节点的 val 是否重复,找到第一个不重复节点
ListNode temp = new ListNode(-1, head);
ListNode prev = temp;
ListNode curr = head;
while (curr != null && curr.next != null) {
if (curr.val == curr.next.val) {
int val = curr.val;
// 出现重复 val,将节点为 val 的全部剔除掉
while (curr != null && curr.val == val) {
curr = curr.next;
}
// 更新 prev.next
prev.next = curr;
} else {
// prev 和 curr 后移
prev = curr;
curr = curr.next;
}
}
return temp.next;
}
}