给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1: 输入: 1->1->2 输出: 1->2
示例 2: 输入: 1->1->2->3->3 输出: 1->2->3
由于输入的列表已排序,因此我们可以通过将结点的值与它之前的结点进行比较来确定它是否为重复结点。如果它是重复的,我们更改上一个结点的 next 指针,以便它跳过当前结点并直接指向下一个结点。
这里我们定义两个指针变量
1、当前遍历的节点cur
2、当前遍历的前置节点pre
指定 pre 指针指向头部head
指定 cur 指针指向head->next
cur存在为循环遍历条件,当cur为空时代表链表遍历完毕,循环结束
当 cur.val 和 pre.val 相等时说明需要去重,则将 pre 的下一个指针指向cur的下一个,这样就能达到去重复的效果
如果不相等则pre和cur移动到下一个位置继续循环
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head==nullptr){
return head;
}
ListNode* pre=head;
ListNode* current=head->next;
while(current!=nullptr){
if(current->val==pre->val){
pre->next=current->next;
delete current;
current=pre->next;
}else{
pre=current;
current=current->next;
}
}
return head;
}
};
1、时间复杂度:O(n)
2、空间复杂度:O(1)