LeetCode 82. 删除排序链表中的重复元素 II(Remove Duplicates from Sorted List II)
题目描述
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
解题思路
由于重复的节点要全部删掉,所以再删除时要先保存重复节点的前一个节点,注意特殊情况是链表的开头就是重复节点,所以应首先找到链表从左往右第一个不重复的节点作为头节点,若头节点不为空,再从其后一个节点开始遍历,如果是重复节点就找到该重复节点后面第一个不重复的节点,并将不重复节点拼接到上一个不重复节点之后,直到链表末尾。
代码
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode* deleteDuplicates(ListNode* head) { 12 if(head == NULL) return NULL; 13 ListNode *left = head; 14 while(left && left->next && left->val == left->next->val){ 15 int val = left->val; 16 while(left && left->val == val) 17 left = left->next; 18 } 19 if(left == NULL) return NULL; 20 head = left; 21 ListNode *right; 22 while(left){ 23 right = left->next; 24 while(right && right->next && right->val == right->next->val){ 25 int val = right->val; 26 while(right && right->val == val) 27 right = right->next; 28 } 29 left->next = right; 30 left = right; 31 } 32 return head; 33 } 34 };