删除排序链表中的重复元素 II
0. 题目
删除排序链表中的重复元素 II
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
1.解题
1.1 分析
主要思路:删除单链表中的重复节点,如果不利用其他额外的空间,那么就需要使用双指针的方法。
因为头结点有可能需要被处理,因此需要声明一个pre节点指向头结点。
慢指针指向pre节点,快指针指向pre.next节点;当快慢指针的值不相等,快慢指针都往前移一步;否则慢指针不动,快指针往前移动,直到快慢指针指向的节点值不相等;
注意:快慢指针节点值的比较应该是slow.next.val == quick.next.val;因为慢指针初始值为pre节点,不参与比较。
1.2 代码 0ms 37.6MB
public ListNode deleteDuplicates(ListNode head) {
if (head == null) return head;
ListNode pre = new ListNode(-1);
pre.next = head;
ListNode slow = pre;
ListNode fast = pre.next;
while (fast != null && fast.next != null) {
if (slow.next.val != fast.next.val) {
slow = slow.next;
fast = fast.next;
} else {
while (fast != null && fast.next != null && slow.next.val == fast.next.val) {
fast = fast.next;
}
slow.next = fast.next;
fast = fast.next;
}
}
return pre.next;
}