82. 刪除排序連結串列中的重複元素II
阿新 • • 發佈:2021-12-16
迭代
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/