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

题目描述

Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
For example,
Given 1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return 2->3.

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */

方法1

不使用辅助头结点的解决方案

class Solution {
public:
    ListNode *deleteDuplicates(ListNode *head) {

    	if(head == nullptr)
    		return nullptr;
    	ListNode * ret = nullptr;
    	ListNode * last = nullptr;//虚尾指针的使用
    	ListNode * p = head;//当前要判断的节点

    	while(p!=nullptr)//需要思考:当前节点满足什么条件,才算合格
    	{
   
    		if(p->next==nullptr || p->val!=(p->next)->val)
    		{
    			if(last == nullptr)
    				ret = p;
    			last = p;
    			p  = p->next;

    		}
    		else
    		{
    			int val = p->val;
    			ListNode *next = p;//寻找下一个”候选的“节点
    			while(next!=nullptr && next->val == val)
    			{
    				ListNode *temp = next;
    				next = next->next;
    				temp->next = nullptr;
    				delete temp;
    			}

    			if(last!=nullptr)
    				last->next = next;//这一步,保证不需要特别的操作去连接
    			p = next;

    		}

    	}

    	return ret;  
    }
};

方法2

上面思路的使用辅助头结点的解决方案

class Solution {
public:
    ListNode *deleteDuplicates(ListNode *head) {

    	if(head == nullptr)
    		return nullptr;
    	ListNode *dummy = new ListNode(-1);
    	dummy->next = head;//这里是直接连好了
    	ListNode * last = dummy;
    	ListNode * p = head;
    	while(p!=nullptr)//变量p的含义:当前要试探的结点
    	{  
    		if(p->next==nullptr || p->val!=(p->next)->val)
    		{
    			last = p;
    			p  = p->next;
    		}
    		else
    		{
    			int val = p->val;
    			ListNode *next = p;//next变量的含义:下一轮要试探的结点
    			while(next!=nullptr && next->val == val)
    			{
    				ListNode *temp = next;
    				next = next->next;
    				temp->next = nullptr;
    				delete temp;
    			}

    			last->next = next;
    			p = next;
    		}
    	}       
        ListNode *ret = dummy->next;
        dummy->next = nullptr;
        delete dummy;
    	return ret        ;
    }
};

方法3

递归解决方案

class Solution {
public:
    ListNode *deleteDuplicates(ListNode *head) 
    {
        if(head==nullptr || (head->next)==nullptr)
            return head;
        if (head->val != head->next->val)
        {   //巧妙的利用函数返回值携带的信息进行自动的连接,
            //而不像循环解决方案中的手动连接
            head->next = deleteDuplicates(head->next);
            return head;
        }
        else
        {
            int val = head->val;
            ListNode *next = head;
            while (next!=nullptr && next->val==val)
            {
            	ListNode *temp = next;
    			next = next->next;
    			temp->next = nullptr;
    			delete temp;    
            }

            return deleteDuplicates(next);
        }
    }
};

posted on 2021-07-24 09:40  朴素贝叶斯  阅读(44)  评论(0编辑  收藏  举报

导航