删除链表中重复的数

题目:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表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集合里有没有,有的话删除,和上面差不多,都要新添加头结点,都要对于当前节点的父节点有记录。

发布了213 篇原创文章 · 获赞 22 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_43113679/article/details/100062164