Problem Statement

Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.

For example, Given 1->2->3->3->4->4->5, return 1->2->5. Given 1->1->1->2->3, return 2->3.

Problem Link

Remove Duplicates from Sorted List II - InterviewBit

Code

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
ListNode* Solution::deleteDuplicates(ListNode* head) {

    if(!head||!head->next)
    return head;
    

    //Traversing towards the first non repeated node of the LL
    while(head&&head->next&&head->val == head->next->val)
    {
        while(head->next&&head->val == head->next->val)
            head = head->next;
        
        head = head->next;
    }

    if(!head)
    return head;
    
    ListNode *p1 = head;
    

    while(p1)
    {
       ListNode *p2 = p1->next;

       //Traversing towards next non repeated node of the LL
       while(p2&&p2->next&&p2->val == p2->next->val)
       {
            while(p2->next&&p2->val == p2->next->val)
                p2 = p2->next;
        
            p2 = p2->next;
        }
       p1->next = p2;
       p1 = p2;
    }
    return head;
}