ListNode *deleteDuplicates(ListNode *head) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
ListNode *p=head,*q;
if (p == NULL || p->next == NULL) return p;
q = p->next;
// invariant: no duplication in range [head, p] && q == p->next
while (q != NULL) // reach the end, loop terminates
{
if (q->val != p->val)
{
// find a new val, advance p to the next, new [head,p] has no duplicates.
p=p->next;
// make sure q==p->next, and move closer to loop end
q=q->next;
}
else
{
// find duplicated value, range [head,p] is not changed.
ListNode *t=q;
// advance q to move closer to loop end, make sure q == p->next
q=q->next;
p->next = q;
// avoid memory leak.
delete t;
}
}
return head;
}
answered
12 Jan, 13:12
roger
66●4
accept rate:
0%