题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。
解题思路:
遍历的同时把重复的结点删除,通过设置两个结点 pre 和 cur,如果 cur 和 cur.next 值相等,就让cur=cur.next, 一直向往下走,直到cur 和 cur.next 值不相等的时候退出循环,这个时候 cur 指的值还是一个重复值,所以我们要把此时的cur也删掉,即让cur=cur.next,然后让pre.next=cur。这道题重点需要考虑的是头结点重复的情况,这里为了让头结点重复的情况也用循环去判断,我们需要重新定义一个辅助头结点,不然我们得单独处理头结点重复的情况。
代码实现:
/*
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(-1);
head.next=pHead;
ListNode pre=head;
ListNode cur=head.next;
while(cur!=null){
if(cur.next!=null&& cur.val==cur.next.val){
while(cur.next!=null&& cur.val==cur.next.val){
cur=cur.next;
}//这时退出循环后的cur还是一个重复值
cur=cur.next;
pre.next=cur;
}else{
pre=cur;
cur=cur.next;
}
}
return head.next;
}
}
复杂度 :时间复杂度:O(n),空间复杂度:O(1)
类似的练手题: LeetCode83