在一個排序的鏈表中,存在重複的結點,請刪除該鏈表中重複的結點,重複的結點不保留,返回鏈表頭指針。 例如,鏈表1->2->3->3->4->4->5 處理後爲 1->2->5spa
遞歸思路,若是當前結點和它的next結點的val值不一樣,則當前結點能夠直接接到已處理完的結點後,繼續刪除重複的過程;若是當前結點和它的next結點的val值相同,則須要繼續遍歷,直到找到一個與當前結點val不一樣的結點做爲新鏈表的頭結點,若是找不到,說明鏈表全部結點元素都同樣,新鏈表爲NULL,不然重新的頭結點出發,繼續刪除重複的過程。指針
非遞歸思路,新建一個虛擬頭結點,若當前結點和它的next結點的val值不一樣,意味着不是重複結點,能夠加入到已處理完的結點後,若相同,須要找到一個與當前結點不一樣的結點,再從新判斷。注意遍歷結束後要把最後的當前結點加入處處理完結點以後。code
C++blog
class Solution { public: ListNode* deleteDuplication(ListNode* pHead) { if(pHead == nullptr || pHead->next == nullptr) return pHead; if(pHead->val != pHead->next->val){ pHead->next = deleteDuplication(pHead->next); return pHead; } else{ ListNode* p = pHead; while(p != nullptr && p->val == pHead->val) p = p->next; return deleteDuplication(p); } } };
class Solution { public: ListNode* deleteDuplication(ListNode* pHead) { if(pHead == nullptr || pHead->next == nullptr) return pHead; ListNode* dummyHead = new ListNode(0); ListNode* p = dummyHead; ListNode* curr = pHead; while(curr != nullptr && curr->next != nullptr){ if(curr->val != curr->next->val){ p->next = curr; p = p->next; } else{ while(curr->next != nullptr && curr->val == curr->next->val) curr = curr->next; } curr = curr->next; } p->next = curr; return dummyHead->next; } };
Java排序
public class Solution { public ListNode deleteDuplication(ListNode pHead) { if(pHead == null || pHead.next == null) return pHead; if(pHead.val != pHead.next.val){ pHead.next = deleteDuplication(pHead.next); return pHead; } else{ ListNode p = pHead; while(p != null && p.val == pHead.val) p = p.next; return deleteDuplication(p); } } }