082J?(2/2). 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

Iteration

 思路,核心是双指针,一前一后。后指针直接指到相同值的最后一位。 如果前指针的下一位就是后指针,说明没有重复,前指针下移一位。 如果前指针的下一位不是后指针,说明有重复,那么前指针的下一位是后指针的下一位。 因为无论如何都会有后指针移动下一位,所以下一次循环会执行将前指针移到后指针,后指针 移动一位的操作。  
为了确保后指针能够指到最后的null,大循环里应当用while(cur!= null)。cur.next!=null 的条件应当包含在内部的while循环里。 
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null) {
            return null;
        }

        ListNode dummyhead = new ListNode(0);
        dummyhead.next = head;
        ListNode pre = dummyhead;
        ListNode cur = head;
        while ( cur!=null) {
            while(cur.next != null && cur.val == cur.next.val){
                cur = cur.next;
            }
            if(pre.next == cur){
                pre = cur;
            }else{
                pre.next = cur.next;
            }
            cur = cur.next;
        }
        return dummyhead.next;
    }
}

Time: O(N), Theta(N) Space: O(1)

这是我又一次写的

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if(head == null) return null;
        ListNode dummyhead = new ListNode(-1);
        dummyhead.next = head;
        ListNode slow = dummyhead;
        ListNode fast = head;
        while(fast!=null){
            while(fast.next!=null&&fast.val == fast.next.val){
                fast = fast.next;
            }
            if(slow.next == fast){
                slow = slow.next;
                fast = fast.next;
            }else{
                slow.next = fast.next;
                fast = slow.next;
            }
        }
        return dummyhead.next;
    }
}

method2: recursive

可以想像一定有一个合适的recursive方法 从讨论中抄的

public class Solution {
    public ListNode deleteDuplicates(ListNode head) {

        if(head==null||head.next==null) return head;

        if(head.val!=head.next.val){
            head.next=deleteDuplicates(head.next);
            return head;
        }
        else{
            while(head.next!=null&&head.val==head.next.val)
                head=head.next;
            return   deleteDuplicates(head.next);
        }
    }
}

Last updated

Was this helpful?