刪除鏈表中重複的節點

在一個排序的鏈表中,存在重複的結點,請刪除該鏈表中重複的結點,重複的結點不保留,返回鏈表頭指針。 例如,鏈表1->2->3->3->4->4->5 處理後爲 1->2->5
解題方法:
1.遍歷鏈表,將重複節點加入HashSet中,以後根據HashSet是否包含重複值進行去重,先刪除根節點,再刪除中間節點;
時間複雜度O(n),空間複雜度再好的狀況下爲O(1),最壞的狀況下爲O(n/2).
2.增長一個頭節點的輔助節點,就不須要hashset了,cur的做用是去除重複的節點,當循環退出時,cur指向的仍是重複節點,所以須要再向後移動一步.
時間複雜度O(n),空間複雜度O(1)ide

public class Solution {
    public ListNode deleteDuplication(ListNode pHead)
    {
        if(pHead == null || pHead.next == null) return pHead;
        ListNode head = new ListNode(Integer.MIN_VALUE);
        head.next = pHead;    //建立輔助頭節點
        ListNode pre = head, cur = head.next;
        while(cur != null){
            if(cur.next != null && cur.next.val == cur.val){   //發現重複節點
                while(cur.next != null && cur.next.val == cur.val){
                    cur = cur.next;
                } 
                cur = cur.next;   //循環退出時cur指向的仍是重複節點,須要再日後移動一步
                pre.next = cur;
            }else{
                pre = cur;
                cur = cur.next;
            }
        }
        return head.next;
    }
}
相關文章
相關標籤/搜索