【每日刷题】删除排序链表中的重复元素 II

day12, 删除排序链表中的重复元素 II

题目来源:leetcode
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5

示例 2:
输入: 1->1->1->2->3
输出: 2->3

解答:有两种思路。
第一种,开辟一个新的数组,用来记录重复元素。。但是很有可能发生溢出,因此放弃了这种想法。
第二种,一个O(n)的算法,即利用已经排序好的特性,首先对于头部的重复元素,例如[1,1,2,2,3]这种情况进行删除处理需要头指针移动,再对内部元素进行处理,例如[1,2,2,3]这种情况,设置三个指针PrePre,Pre,P,PrePre指向重复元素的前一个位置,Pre和P用来比较是否重复。

代码:

/**
 * 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 || !head->next)
            return head;
        
        ListNode* Pre = head, * P = head->next;
        
        //头部处理
        if( Pre->val == P->val && P){
            while(1){
                if( P)
                    while( P && Pre->val == P->val)
                        P = P->next;
                else
                    return NULL;
                
                head = P;
                if( !P)
                    return head;
                Pre = head, P = head->next;
            
                if( P && Pre->val != P->val)
                    break;
                else if( !P)
                    return head;
                else
                    continue;
            }
        }
        
        ListNode* PrePre;
        while( P){
            if( P->next){
                ListNode* test = P->next;
                if( P->val == test->val && Pre->val != P->val)
                    PrePre = Pre;
            }
    
            if( Pre->val != P->val)
                Pre = Pre->next, P = P->next;
            else{
                while(  P && Pre->val == P->val )
                    P=P->next;
                if( !P)
                    PrePre->next = NULL;
                else{
                    if( PrePre){
                        int needDel= PrePre->val;
                        while( Pre->val == needDel){
                            ListNode* Del = Pre;
                            Pre = Pre->next;
                            free( Del);    
                        }
                    }
                    PrePre->next = P;
                    Pre = P, P = P->next;    
                }
            }
        }
        return head;
    }
};

运行结果:【每日刷题】删除排序链表中的重复元素 II_第1张图片


我的微信公众号

在这里插入图片描述

你可能感兴趣的:(每日刷题)