题目描述
- 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路
- 在遍历单链表的时候,记录当前节点的上个节点位置,并且检查当前节点与下一点是否为相同值,如果相同,当前节点继续向后遍历查找相同值的最大长度,然后指针改变指向,难点在于首节点重复节点删除,解决办法就是new个新节点将链表链在新节点上。
- 时间复杂度:O(n)
- 空间复杂度:O(1)
代码
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 slow = head;
ListNode fast = head.next;
while(fast != null && fast.next != null){
if(fast.val != fast.next.val){
slow=slow.next;
fast=fast.next;
}else{
while(fast.next != null && fast.val == fast.next.val){
fast=fast.next;
}
slow.next=fast.next;
fast=fast.next;
}
}
return head.next;
}
}
结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210330234251190.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNzIyOTE0,size_16,color_FFFFFF,t_70)