82. 删除排序链表中的重复元素 II
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。
返回同样按升序排列的结果链表。
小提示:一般链表的删除题最好弄一个虚拟结点,指向头一般设置为0,这样就不会逻辑被扰乱
思路:用双指针解法一个前指针和后指针,还有个标记位,前指针用来判断有没有相同的元素,后指针用来删除元素
- 如果没有相同元素,则两个直接指向自己的next
- 这个时候碰到相同的元素则用循环来指向该相同元素的最后一个元素(如果有3个3,则指向最后一个三)
- 这个时候slow.next=fast.next; fast.next=null; fast=slow.next;
- 以此类推。这个方法只需要循环一次就可以结束,时间复杂度为o(n)
- 5.这里用标识位的目的是用来区分是有没有找到相同的结点。
- 6.返回0的下一个结点就行。
public ListNode deleteDuplicates(ListNode head) {
ListNode slow=new ListNode(0);
ListNode slowIndex=slow;
slow.next=head;
ListNode fast=head;
int falg=0;
while(fast!=null&&fast.next!=null){
while(fast.next!=null&&fast.val==fast.next.val){
fast=fast.next;
falg=1;
}
if(falg==1){
slow.next=fast.next;
fast.next=null;
fast=slow.next;
falg=0;
}else{
slow=fast;
fast=fast.next;
}
}
return slowIndex.next;
}
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户