在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5
数据范围:链表长度满足 0≤�≤1000 0≤n≤1000 ,链表中的值满足 1≤���≤1000 1≤val≤1000
进阶:空间复杂度 �(�) O(n) ,时间复杂度 �(�) O(n)
例如输入{1,2,3,3,4,4,5}时,对应的输出为{1,2,5},对应的输入输出链表如下图所示:
示例1
输入:
{1,2,3,3,4,4,5}
复制返回值:
{1,2,5}
复制
示例2
输入:
{1,1,1,8}
复制返回值:
{8}
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
方法1:规避方法,因为数据范围为0~1000,可以遍历链表的数据,然后做标记,只把出现过一次的节点添加到新的节点里。
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pHead ListNode类
* @return ListNode类
*/
#include <stdlib.h>
struct ListNode* deleteDuplication(struct ListNode* pHead ) {
int array[1001] ={0};
int i = 0;
struct ListNode* tmpListNode = pHead;
struct ListNode* firstNode =(struct ListNode*) malloc(sizeof(struct ListNode));
struct ListNode* outListNode = firstNode;
memset(firstNode, 0, sizeof(struct ListNode));
while(tmpListNode != NULL){
array[tmpListNode->val]++;
tmpListNode = tmpListNode->next;
}
tmpListNode = pHead;
while(tmpListNode) {
if(array[tmpListNode->val] == 1){
//printf("%d\n",tmpListNode->val);
firstNode->next = tmpListNode;
firstNode = firstNode->next;
}
tmpListNode = tmpListNode->next;
}
firstNode->next = NULL;
return outListNode->next;
}
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/*方法2: 设置前驱节点pre,一直指向最终实际的节点值; pre->next指向有可能的下一个节点;cur指向当前节点,并不断往后遍历*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pHead ListNode类
* @return ListNode类
*/
#include <stdlib.h>
struct ListNode* deleteDuplication(struct ListNode* pHead ) {
struct ListNode* vHead = (struct ListNode*)malloc(sizeof(struct ListNode));
memset(vHead, 0, sizeof(struct ListNode));
struct ListNode* pre = vHead;
struct ListNode* cur = pHead;
if(cur->next == NULL || cur == NULL)
return cur;
while(cur){
if(cur->next != NULL && cur->val ==cur->next->val){
cur = cur->next;
while(cur->next != NULL && cur->val ==cur->next->val) {
cur = cur->next;
}
cur = cur->next;
pre->next = cur;
} else if(cur->next == NULL || cur->val !=cur->next->val){
pre->next = cur;
pre = cur;
cur = cur->next;
}
}
return vHead->next;
}