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