在一個排序的鏈表中,存在重複的結點,請刪除該鏈表中重複的結點,重複的結點不保留,返回鏈表頭指針。 例如,鏈表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; } }