描述
给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。
例如:
给出的链表为1→2→3→3→4→4→51→2→3→3→4→4→5, 返回1→2→51→2→5.
给出的链表为1→1→1→2→31→1→1→2→3, 返回2→32→3.
数据范围:链表长度 0≤n≤100000≤n≤10000,链表中的值满足 ∣val∣≤1000∣val∣≤1000
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
进阶:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
示例1
输入:
{1,2,2}
返回值:
{1}
示例2
输入:
{}
返回值:
{}
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
public ListNode deleteDuplicates (ListNode head) {
if (head == null || head.next == null) return head;
ListNode dum = new ListNode(-1); // 哑节点
dum.next = head;
ListNode p = head;
ListNode prev = dum; // 用于跟踪当前非重复元素的最后一个节点
while (p != null) {
if (p.next != null && p.val == p.next.val) {
// 寻找下一个非重复节点
int t = p.val;
while (p != null && p.val == t) {
p = p.next;
}
// 更新prev.next跳过所有重复节点
prev.next = p;
} else {
// 移动到下一个节点
p = p.next;
// 更新prev以跟踪当前非重复节点的最后一个节点
prev = prev.next;
}
}
// 返回新的头节点(dum.next)
return dum.next;
}
}