删除排序链表中的重复元素 II 20201228

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

0. 题目

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

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

示例 1:
    输入: 1->2->3->3->4->4->5
    输出: 1->2->5
示例 2:
	输入: 1->1->1->2->3
	输出: 2->3

1.解题

1.1 分析

主要思路:删除单链表中的重复节点,如果不利用其他额外的空间,那么就需要使用双指针的方法。
因为头结点有可能需要被处理,因此需要声明一个pre节点指向头结点。
慢指针指向pre节点,快指针指向pre.next节点;当快慢指针的值不相等,快慢指针都往前移一步;否则慢指针不动,快指针往前移动,直到快慢指针指向的节点值不相等;

注意:快慢指针节点值的比较应该是slow.next.val == quick.next.val;因为慢指针初始值为pre节点,不参与比较。

1.2 代码 0ms 37.6MB

public ListNode deleteDuplicates(ListNode head) {
	if (head == null) return head;
	ListNode pre = new ListNode(-1);
	pre.next = head;
	ListNode slow = pre;
	ListNode fast = pre.next;
	while (fast != null && fast.next != null) {
		if (slow.next.val != fast.next.val) {
			slow = slow.next;
			fast = fast.next;
		} else {
			while (fast != null && fast.next != null && slow.next.val == fast.next.val) {
				fast = fast.next;
			}
			slow.next = fast.next;
			fast = fast.next;
		}
	}
	return pre.next;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值