Remove Duplicates from Sorted List I
Problem Statement (link):
Given a sorted linked list, delete all duplicates such that each element appear only once.
For example,
Given
Given
Analysis:For example,
Given
1->1->2, return 1->2.Given
1->1->2->3->3, return 1->2->3.Use two pointers, one pointer points to the current node, the other pointer advances if there's duplicates.
The time complexity is O(n), where n is length of the linked list. The space complexity is constant.
Code:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *deleteDuplicates(ListNode *head) {
if (head==NULL || head->next==NULL) return head;
ListNode *p1=head;
while (p1->next!=NULL) {
ListNode *p2=p1->next;
while (p2 && p1->val==p2->val)
p2=p2->next;
if (p1->next==p2) // no dup
p1=p1->next;
else
p1->next=p2;
}
return head;
}
};
Remove Duplicates from Sorted List II
Problem Statement (link):
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
For example,
Given
Given
Analysis:For example,
Given
1->2->3->3->4->4->5, return 1->2->5.Given
1->1->1->2->3, return 2->3.Once the previous problem is understood, the only difference with this problem is that we need to save previous node.
Code:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *deleteDuplicates(ListNode *head) {
if (head==NULL || head->next==NULL) return head;
ListNode *prev=new ListNode(INT_MIN);
prev->next=head;
head=prev;
while(prev->next!=NULL) {
ListNode *curr=prev->next;
// advance pointer if duplicate
while(curr->next && curr->val==curr->next->val)
curr=curr->next;
if (curr!=prev->next) // re-link prev if duplicate
prev->next=curr->next;
else // advance prev if no duplicate
prev=prev->next;
}
return head->next;
}
};
No comments:
Post a Comment