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] 内
- -100 <= Node.val <= 100
- 题目数据保证链表已经按升序 排列
解题思路:
- 用数组存储所有的val,然后进行遍历(O(n))将重复的值赋101
- 结束后重新遍历数组,另外申请一个链表进行填值。
struct ListNode* deleteDuplicates(struct ListNode* head){
struct ListNode *p1 = NULL, *behind = NULL, *front = NULL, *realhead = NULL;
p1 = head;
int nums[300] = {0}, top = 0, j = 0;
while(p1){
nums[top++] = p1->val;
p1 = p1->next;
}
for(int i = 0;i < top - 1;){
if(nums[i] == nums[i + 1]){
j = i + 1;
while(j < top){
if(nums[i] != nums[j]){
break;
}
nums[j] = 101;
++j;
}
nums[i] = 101;
i = j;
}else{
++i;
}
}
for(int i = 0;i < top;++i){
if(nums[i] != 101){
front = (struct ListNode*)calloc(1, sizeof(struct ListNode));
front->val = nums[i];
front->next = NULL;
if(behind != NULL){
behind->next = front;
}
behind = front;
}
if(realhead == NULL) realhead = front;
}
return realhead;
}