LeetCode 82. 刪除排序鏈表中的重復元素 II(Remove Duplicates from Sorted List II)
阿新 • • 發佈:2018-08-09
特殊情況 代碼 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) returnNULL; 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)