【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;
    }
};
posted @ 2020-04-09 22:56  Flix  阅读(488)  评论(0编辑  收藏  举报