Leetcode--082-删除排序链表中的重复元素II

Leetcode–082-删除排序链表中的重复元素 II

题目描述

  • 存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。
  • 返回同样按升序排列的结果链表。

mark

1
2
输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]

mark

1
2
输入:head = [1,1,1,2,3]
输出:[2,3]

提示:

  • 链表中节点数目在范围 [0, 300]
  • -100 <= Node.val <= 100
  • 题目数据保证链表已经按升序排列

方法一:一次遍历

  • 由于给定的链表是排好序的,因此重复的元素在链表中出现的位置是连续的,因此我们只需要对链表进行一次遍历,就可以删除重复的元素。由于链表的头节点可能会被删除,因此我们需要额外使用一个哑节点(dummy node)指向链表的头节点。
  • 具体地,首先从指针cur指向链表的哑节点,
    • 随后开始对链表进行遍历。如果当前cur.nextcur.next.next对应的元素相同,那么我们就需要将cur.next 以及所有后面拥有相同元素值的链表节点全部删除。
    • 记下这个元素值 x,随后不断将cur.next从链表中移除,直到 cur.next为空节点或者其元素值不等于x 为止。此时,将链表中所有元素值为x的节点全部删除。
  • 如果当前cur.nextcur.next.next 对应的元素不相同,那么说明链表中只有一个元素值为cur.next 的节点,那么就可以将 cur 指向 cur.next
  • 当遍历完整个链表之后,我们返回链表的的哑节点的下一个节点 dummy.next 即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution{
public ListNode deleteDuplicates(ListNode head){
// 1. 如果链表为空
if(head == null){
return head;
}
// 2. 创建哑节点
ListNode dummy = new ListNode(0,head);
ListNode cur = dummy;

// 3. 处理逻辑
while(cur.next != null && cur.next.next != null){
if(cur.next.val == cur.next.next.val){ // 如果是重复元素的话
int x = cur.next.val; // 为了在删除前记录重复的值大小
while(cur.next != null && cur.next.val == x){ // 循环删除重复元素
cur.next = cur.next.next; // 删除这个重复元素
}
}else{ // 如果不是重复元素的话
cur = cur.next; // 指针向前走一位
}
}

// 4. 返回dummy.next
return dummy.next;
}
}

复杂度分析

  • 时间复杂度:O(n),其中 n 是链表的长度。
  • 空间复杂度:O(1)。
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信