1. 程式人生 > 其它 >82. 刪除排序連結串列中的重複元素II

82. 刪除排序連結串列中的重複元素II

迭代

class Solution {
    public ListNode deleteDuplicates(ListNode head) {

        /**
         * 節點數小於2不用去重
         */
        if (head == null || head.next == null){
            return head;
        }

        /**
         * 從虛擬頭節點開始遍歷
         */
        ListNode dummyHead = new ListNode(0, head);
        ListNode prev = dummyHead;
        int delete;

        /**
         * 如果後面兩個節點相等,就記錄下這個值,然後prev.next指標後移直到不等於這個值
         */
        while (prev.next != null && prev.next.next != null){

            if (prev.next.next.val == prev.next.val){

                delete = prev.next.val;

                /**
                 * 如果找到了不同值的prev.next,prev指標不用再後移,繼續進行下一個值的判斷
                 */
                while (prev.next != null && prev.next.val == delete){
                    prev.next = prev.next.next;
                }
            }
            else {
                prev = prev.next;
            }
        }

        return dummyHead.next;
    }
}

/**
 * 時間複雜度 O(n)
 * 空間複雜度 O(1)
 */

遞迴

class Solution {
    public ListNode deleteDuplicates(ListNode head) {

        /**
         * 終止條件
         * 如果連結串列為空或者只有一個節點,不用去重
         */
        if (head == null || head.next == null){
            return head;
        }

        ListNode next = deleteDuplicates(head.next);

        /**
         * 假設頭節點以外的節點已經完成去重
         * 最後判斷頭節點是不是重複的元素
         * 因為連結串列是升序的,如果頭節點和下一個節點相等,那這兩個節點都要刪除
         * 如果不相等,也不能直接認為頭節點沒有重複,因為有可能和它相等的節點都被刪了而只留下它一個,和原連結串列的第二個節點比較一下就可判斷是否是重複的
         */
        if (next != null && head.val == next.val){
            return next.next;
        }
        else {

            if (head.val == head.next.val){
                return next;
            }
            else {

                head.next = next;
                return head;
            }
        }
    }
}

/**
 * 時間複雜度 O(n)
 * 空間複雜度 O(n)
 */

https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/