2024.1.15力扣每日一题——删除排序链表中的重复元素 II

题目来源

力扣每日一题;题序:82

我的题解

方法一 三指针+虚拟头结点

先构建一个带虚拟头结点的链表,然后使用三个指针p,left,right,分别指向最右非重复节点,可能重复元素的左边界和可能重复元素的右边界。

时间复杂度:O(n)。n为连标的长度
空间复杂度:O(1)。

public ListNode deleteDuplicates(ListNode head) {
if(head==null||head.next==null)
        return head;
    ListNode root=new ListNode();
    root.next=head;
    ListNode p=root;
    ListNode left=root.next;
    ListNode right=left;
    while(right!=null){
        int count=0;
        //统计相同的个数
        while(right!=null&&left.val==right.val){
            count++;
            right=right.next;
        }
        // 判断左边界下一个节点是不是右边界,若不是则左边界右移
        while (left.next != right)
            left = left.next;
        //若统计的个数大于1则表示是重复元素
        if(count>1){
            //需要删除重复元素
            p.next=right;
        }else {
            //结果指针指向左边界
            p = left;
        }
        //左边界移动
        left = left.next;
    }
    return root.next;
}
//优化版本
public ListNode deleteDuplicates(ListNode head) {
	if(head==null||head.next==null)
      return head;
  ListNode root=new ListNode();
  root.next=head;
  ListNode p=root;
 
  while(p.next!=null&&p.next.next!=null){
     if(p.next.val==p.next.next.val){
         int data=p.next.val;
         while(p.next!=null&&p.next.val==data){
             p.next=p.next.next;
         }
     }else{
         p=p.next;
     }
  }
  return root.next;
}

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜菜的小彭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值