82. Remove Duplicates from Sorted List II
题目描述和难度
- 题目描述:
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5 输出: 1->2->5
示例 2:
输入: 1->1->1->2->3 输出: 2->3
- 题目难度:中等。
- 英文网址:82. Remove Duplicates from Sorted List II 。
- 中文网址:82. 删除排序链表中的重复元素 II 。
思路分析
求解关键:分析清楚各种可能出现的情况,其实代码并不难写,我把思路都作为注释写在代码中了。
参考解答
参考解答1
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
public ListNode(int[] nums) {
if (nums == null || nums.length == 0) {
throw new IllegalArgumentException("arr can not be empty");
}
this.val = nums[0];
ListNode curr = this;
for (int i = 1; i < nums.length; i++) {
curr.next = new ListNode(nums[i]);
curr = curr.next;
}
}
@Override
public String toString() {
StringBuilder s = new StringBuilder();
ListNode cur = this;
while (cur != null) {
s.append(cur.val + " -> ");
cur = cur.next;
}
s.append("NULL");
return s.toString();
}
}
public class Solution {
public ListNode deleteDuplicates(ListNode head) {
if (head == null) {
return null;
}
// 这里我们要清楚,例如 1 1 2 3 ,头结点也是有可能被删除的,所以要设置虚拟头结点
// 只要涉及头结点的操作,我们都设立虚拟头结点
ListNode dummyNode = new ListNode(-1);
dummyNode.next = head;
ListNode curNode = dummyNode;
// 题目要求的删除结点这个操作是站在被删除结点前面的
// 所以循环可以继续的条件应该这样写
while (curNode.next != null && curNode.next.next != null) {
// 如果接连两个结点的 val 相等,至少要把它们都删掉
if (curNode.next.val == curNode.next.next.val) {
// 要删除的起点至少应该是当前判断相同的结点的第 2 个
ListNode delNode = curNode.next.next;
// 如果后面还有相同的结点,delNode 后移一位,即 delNode 应该是指向相同的结点的最后一个
// 注意:这里得用循环,例如: 1 2 2 2 2 2 2 2 2 3 3 3
// 得让 delNode 结点挪到最后一个 2 上
while (delNode.next != null && delNode.next.val == delNode.val) {
delNode = delNode.next;
}
// 接下来把有重复的链表段删除就可以了
// 1 2 2 2 3
// curNode delNode
curNode.next = delNode.next;
delNode.next = null;
} else {
// 否则向前走一步
curNode = curNode.next;
}
}
return dummyNode.next;
}
public static void main(String[] args) {
int[] nums = {1, 1, 1, 2, 3, 3, 4, 4, 5, 6, 7, 8, 8, 8, 9};
ListNode head = new ListNode(nums);
Solution solution = new Solution();
ListNode deleteDuplicates = solution.deleteDuplicates(head);
System.out.println(deleteDuplicates);
}
}
本篇文章的地址为 https://liweiwei1419.github.io/leetcode-solution/leetcode-0082-remove-duplicates-from-sorted-list-ii ,如果我的题解有错误,或者您有更好的解法,欢迎您告诉我 liweiwei1419@gmail.com 。