leetcode 83. 删除排序链表中的重复元素 及 82. 删除排序链表中的重复元素 II

83. 删除排序链表中的重复元素

问题描述

给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3

代码(快慢指针法)

* 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 NULL;
        ListNode* slow=head,*fast=head;
        while(fast)
        {
            if(slow->val != fast->val)
            {
                slow = slow->next;
                slow->val = fast->val;
                fast = fast->next;
            }
            else{
                fast = fast->next;
            }
        }
        slow->next = NULL;
        return head;
    }
};

结果:

执行用时 :12 ms, 在所有 cpp 提交中击败了94.60%的用户
内存消耗 :9.1 MB, 在所有 cpp 提交中击败了65.38%的用户

代码2(便于和下一个问题类比)

/**
 * 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* ans = new ListNode(0),*pre = ans,*cur;
        pre->next = head;
        while(pre->next!= NULL)
        {
            cur = pre->next;
            while(cur->next && cur->val == cur->next->val)cur=cur->next;
            if(cur != pre->next)pre->next = cur;
            else{
                pre = pre->next;
            }
        }
        return ans->next;
    }
};

结果:

执行用时 :8 ms, 在所有 C++ 提交中击败了96.49%的用户
内存消耗 :13.4 MB, 在所有 C++ 提交中击败了5.01%的用户

82. 删除排序链表中的重复元素 II

问题描述

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3

代码

/**
 * 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* ans = new ListNode(0),*pre = ans,*cur;
        ans->next = head;
        while(pre->next)
        {
           cur = pre->next;
           while(cur->next && cur->val == cur->next->val)cur = cur->next;//去除重复元素
           if(cur != pre->next)pre->next = cur->next;//如果存在重复元素,则指向重复元素下一位
           else pre = pre->next;//不存在重复元素指向目前元素的下一位即可
        }
        return ans->next;
    }
};

结果:

执行用时 :8 ms, 在所有 C++ 提交中击败了88.88%的用户
内存消耗 :13.1 MB, 在所有 C++ 提交中击败了5.01%的用户
posted @ 2020-02-26 09:14  曲径通霄  阅读(124)  评论(0编辑  收藏  举报