【LeetCode-链表】删除链表中的重复元素
题目描述
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例:
输入: 1->1->2->3->3
输出: 1->2->3
题目链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/
思路
双指针法。从链表头开始构造一快一慢两个指针:slow和fast,fast先移动,当遇到和slow元素值不同的节点时停下来,然后将slow指向fast并对slow和fast进行更新。代码如下:
/**
* 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==nullptr){
return nullptr;
}
ListNode* slow = head;
ListNode* fast = head->next;
while(fast!=nullptr){ // 注意终止条件
while(fast!=nullptr && fast->val==slow->val){
fast = fast->next;
}
slow->next = fast;
slow = fast;
if(fast!=nullptr){ // 注意判断是否为空
fast = fast->next;
}
}
return head;
}
};
这样写也行(推荐):
/**
* 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* slow = head;
ListNode* fast = head;
while(slow!=NULL && slow->next!=NULL){
while(fast!=NULL && fast->val==slow->val){
fast = fast->next;
}
slow->next = fast;
slow = fast;
}
return head;
}
};
- 时间复杂度:O(n)
遍历链表一边。 - 空间复杂度:O(1)
更简洁的写法:
/**
* 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==nullptr){
return nullptr;
}
ListNode* curNode = head;
while(curNode!=nullptr && curNode->next!=nullptr){
if(curNode->val==curNode->next->val){
curNode->next = curNode->next->next;
}else{
curNode = curNode->next;
}
}
return head;
}
};