2024.1.15
题目来源
我的题解
方法一 三指针+虚拟头结点
先构建一个带虚拟头结点的链表,然后使用三个指针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;
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~