Remove Duplicates from Sorted List

Given a sorted linked list, delete all duplicates such that each element appear only once.

For example, Given 1->1->2, return 1->2. Given 1->1->2->3->3, return
1->2->3.

思路

需不需要用dummy node可以看这个链表的头节点会不会被改变,这题中因为重复的元素还需要保留一个,所以头结点是可以确定的,不需要用dummy node。例子中没有给清楚,但是跑leetcode的时候,会出现1 -> 1 -> 1 这种情况,所以用了while来check,cur是不是null。比较pre.val是否等于cur.val, 如果相等那么,cur继续往后找到第一个不相同的。如果pre.next还是cur的话,说明没有删除任何结点,所以只要将pre和cur向下移。如果pre.next != cur 的话,说明有需要删除的节点,让pre.next = cur。

代码

public ListNode deleteDuplicates(ListNode head) {
    //corner case
    if(head == null || head.next == null) return head;
    ListNode cur = head;
    ListNode pre = head;
    while(cur != null){
        while(cur != null && pre.val == cur.val){
            cur = cur.next;
        }
        if(pre.next != cur) pre.next = cur;
        else{
            pre = pre.next;
            cur = cur.next;
        }
    }
    return head;
}

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.

For example, Given 1->2->3->3->4->4->5, return 1->2->5. Given 1->1->1->2->3, return 2->3.

思路

和上一题思路一样,但是这里要把所有重复的删掉,所以可能会变化本来的头结点,这里要用到dummy node来保证head也可以有一个Pre node。可以分这几种情况考虑,corner case:当链表是Null, 链表的长度小于等于1。不带重复的1->2->3, 带重复的:1->1->1, 1->1->2->2, 1->1->2

代码

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

annielulu
5 声望5 粉丝

引用和评论

0 条评论