Problem: 82. 删除排序链表中的重复元素 II
题目描述
思路
思路类似83题的常规解法和建立虚拟头节点的结合,不同的是本题目要删去所有重复节点,为解决该问题我们再次利用虚拟头节点和尾指针,遍历时若遇到当当前节点值和其下一个节点值相等时则说明已经出现重复,则时再次通过循环遍历加上指针的移动操作达到去除所有重复的节点值的目的
解题方法
1.建立虚拟头节点,尾指针指向创建的虚拟头节点(便于解决原始待删除的链表头部就出现重复值的情况)
2.循环退出条件为tail.next != null && tail.next.next != null(假设tail为定义的尾节点)
3.当出现tail.next.val == tail.next.next.val时表示出现重复,用一个指针(名为noReptition )通过循环遍历,退出条件为noReptition != null && noReptition.val == tail.next.val,然后让tail.next将noReptition指向的节点;若不出现重复,则直接迭代遍历
4.返回虚拟头节点的下一个节点。
复杂度
- 时间复杂度:
O ( n ) O(n) O(n)
- 空间复杂度:
O ( 1 ) O(1) O(1)
Code
/**
* 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; }
* }
*/
class Solution {
/**
* Remove Duplicates from Sorted List II
*
* @param head The head node of linked list
* @return ListNode
*/
public ListNode deleteDuplicates(ListNode head) {
if (head == null) return null;
ListNode dummyNode = new ListNode(Integer.MAX_VALUE,head);
//The head node of the linked list may also be deleted
//So define another "head node"
ListNode tail = dummyNode;
while (tail.next != null && tail.next.next != null) {
//Duplication occurs
if (tail.next.val == tail.next.next.val) {
ListNode noReptition = tail.next;
//Start to find all duplicate elements
while (noReptition != null && noReptition.val == tail.next.val) {
noReptition = noReptition.next;
}
tail.next = noReptition;
} else {
tail = tail.next;
}
}
return dummyNode.next;
}
}