1. 程式人生 > >LeetCode 82. 刪除排序鏈表中的重復元素 II(Remove Duplicates from Sorted List II)

LeetCode 82. 刪除排序鏈表中的重復元素 II(Remove Duplicates from Sorted List II)

特殊情況 代碼 size def 特殊 strong 全部 struct ext

題目描述

給定一個排序鏈表,刪除所有含有重復數字的節點,只保留原始鏈表中 沒有重復出現 的數字。

示例 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 };

LeetCode 82. 刪除排序鏈表中的重復元素 II(Remove Duplicates from Sorted List II)