删除链表中重复的数

题目:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
   
	  public ListNode deleteDuplication(ListNode pHead)
	    {
		  if(pHead==null||pHead.next==null) {
			  return pHead;
		  }
		  //为了预防头结点和第二个一样的情况,这个必须有,要不头部节点为空这个很难办
		  ListNode Head = new ListNode(0);
		  Head.next =pHead;
		  //遍历节点的上一个节点,当知道当前节点和后面是重复的,就需要把当前节点的父节点指向后面第一个不重复的节点
		  ListNode left = Head;
		  //遍历的节点
		  ListNode right = Head.next;
		  while(right!=null) {
			  if(right.next!=null&&right.val == right.next.val) {
				  //找到最后一个节点和前面重复一样的
				  while(right.next!=null&&right.val == right.next.val) {
					  right = right.next;
				  }
				  left.next = right.next;
				  right =right.next;
			  }else {
				  right = right.next;
				  left = left.next;
			  }
		  }
		return Head.next;
		  
	    }

}

上面是一种方法,上面这种也就是n+的复杂度,绝对没有到2n
下面说一种2n的,其实就是用set集合,先遍历一遍,把重复的放在set集合里
第二次遍历可以对应set集合里有没有,有的话删除,和上面差不多,都要新添加头结点,都要对于当前节点的父节点有记录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值