83. 删除排序链表中的重复元素
题目
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
/**
* 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) return head;
ListNode* pre=head;
while(pre!=NULL){
ListNode* tail=pre->next;
while(tail && tail->val==pre->val){
tail=tail->next;
}
pre->next=tail;
pre=tail;
if(tail==NULL) break;
tail=tail->next;
}
return head;
}
};
更快更精简的方法:
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head==NULL) return head;
ListNode* cur=head;
while(cur!=NULL&&cur->next!=NULL){
if(cur->val==cur->next->val){
cur->next=cur->next->next;
}
else{
cur=cur->next;
}
}
return head;
}
};
82. 删除排序链表中的重复元素 II
题目
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head==null) return null;
if(head.next==null) return head;
ListNode dummy=new ListNode(0);
dummy.next=head;
ListNode now=head;
ListNode pre=dummy;
while(now!=null){
if(now.next!=null&&now.val==now.next.val){
int tmp=now.val;
while(now!=null&&now.val==tmp){
now=now.next;
}
}
else{
pre.next=now;
pre=now;
now=now.next;
}
}
pre.next=now;
return dummy.next;
}
}