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