题目描述
给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。
例如:
给出的链表为1→2→3→3→4→4→5, 返回1→2→5.
给出的链表为1→1→1→2→3, 返回2→3.
示例1
输入
{1,2,2}
返回值
{1}
//快慢指针
//时间复杂度O(N),空间复杂度O(1)
public ListNode deleteDuplicates(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode slow = dummy;
ListNode fast = dummy.next;
//fast指针遍历链表,比较前后元素值
while (fast != null && fast.next != null) {
if (fast.val != fast.next.val) {
//遇到不重复的,移动slow指针
slow = slow.next;
} else {
//否则,循环判断直到遇到不重复的元素
while (fast.next != null && fast.val == fast.next.val) {
fast = fast.next;
}
slow.next = fast.next;
}
fast = fast.next;
}
return dummy.next;
}