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

Posted 清水寺扫地僧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 82. 删除排序链表中的重复元素 II相关的知识,希望对你有一定的参考价值。

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

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。

返回同样按升序排列的结果链表。

示例 1

输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]

示例 2

输入:head = [1,1,1,2,3]
输出:[2,3]

提示

链表中节点数目在范围 [ 0 , 300 ] [0, 300] [0,300]
− 100 < = N o d e . v a l < = 100 -100 <= Node.val <= 100 100<=Node.val<=100
题目数据保证链表已经按升序排列


迭代解法

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
    	if(!head) return nullptr; //如果空链表,直接返回
    	ListNode *dummyNode = new ListNode(101, head); //创建一辅助头节点
    	ListNode *preNode = dummyNode, *curNode = head;
    	ListNode *adjNode = dummyNode;
    	while(curNode) {
    		//如果preNode和curNode节点值相等,则一直向后遍历
			while(curNode && curNode->val == preNode->val) { 
				preNode = curNode;
				curNode = curNode->next;
			}
			//如果adjNode的下一节点不是preNode,则说明中间出现了重复节点
			//这时preNode指向重复节点的最后一个节点,则adjNode应该跳过preNode直接指向curNode
			if(adjNode->next != preNode) adjNode->next = curNode;
			//如果是,则说明没有出现重复节点,所以直接把adjNode节点指向preNode
			//这里也完成了adjNode节点的更新
			else adjNode = preNode;

			//处理了当前轮次的preNode和curNode,则需要更新
			preNode = curNode;
			//这里需要注意curNode是否为nullptr
			if(curNode) curNode = curNode->next;
		}
		//返回辅助头节点的next节点即可
		return dummyNode->next;
    }
};

递归解法

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if(!head || !head->next) return head; //当链表中只有一个节点,或空链表,则直接返回head
        ListNode *p = head; 
        while(p && p->val == head->val) p = p->next; //找到第一个和头节点不重复的节点
        if(p == head->next) head->next = deleteDuplicates(p); //不重复,则当前头节点保留
        else head = deleteDuplicates(p); //重复,则从不重复处返回,当前头节点不保留
        return head;
    }
};

以上是关于LeetCode 82. 删除排序链表中的重复元素 II的主要内容,如果未能解决你的问题,请参考以下文章

leetcode(82)---删除排序链表中的重复元素(双指针)

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

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

LeetCode82----删除排序链表中的重复元素 II

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

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