82. Remove Duplicates from Sorted List II

题目

Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.

Example 1:

Input: 1->2->3->3->4->4->5
Output: 1->2->5

Example 2:

Input: 1->1->1->2->3
Output: 2->3

我的想法

核心思想:
用prev指向已经删除重复元素的子list的最后一个结点,temp用来遍历整个list。遍历过程中如果找到不重复的结点,则将其接到prev后,并更新prev指针(始终指向无重复子list的最后一个结点)

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if(head == null || head.next == null) return head;
        ListNode prev = null;  //无重复子list的最后一个结点
        ListNode temp = head;
        int equal; //记录当前重复的数值
        if(head.val == head.next.val) equal = head.val;//第一个结点就是重复结点
        else equal = head.val - 1;//第一个结点不是重复结点
        while(temp != null) {
            if(temp.val != equal) { //与上一个结点不重复
                //与上一个结点不重复,但是与下一个结点重复
                if(temp.next != null && temp.val == temp.next.val) {
                    if(prev != null) prev.next = null;
                    equal = temp.val;
                    temp = temp.next;
                    continue;
                }
                //无重复子list有值,则直接把当前结点接在子list之后
                if(prev != null) {
                    prev.next = temp;
                    prev = temp;
                }
                //当前无重复子list为空,则将当前结点放入子list中
                else {
                    prev = temp;
                    head = prev;//头部
                }
                equal = temp.val;
            }
            temp = temp.next;
        }
        return prev == null ? prev : head;
    }
}

解答

leetcode solution 1: Recursion

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if(head == null) return head;
        if(head.next != null && head.next.val == head.val) {//重复
            while(head.next != null && head.next.val == head.val)
                head = head.next; //找到最后一个重复结点
            return deleteDuplicates(head.next); 
        }
        else { //不重复
            head.next = deleteDuplicates(head.next);
            return head;
        }
    }
}

leetcode solution 2: Iteration
跟方法1也差不多,方法一用递归代替这里的外层循环

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if(head==null) return null;
        ListNode FakeHead=new ListNode(0);
        FakeHead.next=head;
        ListNode pre=FakeHead;
        ListNode cur=head;
        while(cur!=null){
            while(cur.next!=null&&cur.val==cur.next.val){
                cur=cur.next;
            }
            if(pre.next==cur){
                pre=pre.next;
            }
            else{
                pre.next=cur.next;
            }
            cur=cur.next;
        }
        return FakeHead.next;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值