持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情
1、删除有序链表中的重复元素I
1、原题简述
[](删除有序链表中重复的元素-I_牛客题霸_牛客网 (nowcoder.com))
删除给出链表中的重复元素(链表中元素从小到大有序),使链表中的所有元素都只出现一次
例如:
给出的链表为{1,1,2,2},返回{1,2}.
给出的链表为{1,1,2,2,3,3,3,3}返回{1,2,3}
数据范围:链表长度满足1000≤n≤100,链表中任意节点的值满足 |val| ≤100
进阶:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
2、源代码
struct ListNode* deleteDuplicates(struct ListNode* head ) {
// write code here
struct ListNode *l,*p;
p=(struct ListNode*)malloc(sizeof(struct ListNode));
l=head;
int i=0;
while(l!=NULL)
{
if(l->val==l->next->val&&l->next!=NULL)//如果当前节点的数据区域与下一节点的数据域相同,就删除下一节点
{
p=l->next;
l->next=p->next;
i=1;
}
else {
l=l->next;//如果不相同就后移一位
}
}
return head;
}
2、删除有序链表中的重复元素II
1、原题简述
[](删除有序链表中重复的元素-II_牛客题霸_牛客网 (nowcoder.com))
给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。
例如:
给出的链表为{1,1,2,3,3,4,4,5},返回{2,5}.
数据范围:链表长度 100000≤n≤10000,链表中的值满足∣val∣≤1000
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
进阶:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
2、源代码
struct ListNode* deleteDuplicates(struct ListNode* head ) {
// write code here
if(head==0) return 0;//head==0是几个意思????head==NULL????
//不为空结点
struct ListNode* np=(struct ListNode*)malloc(sizeof(struct ListNode));
np->next=head;//设置一个头节点
struct ListNode* p0=np;struct ListNode* p1=head;
//p0为有头链表
//p1为无头链表
int count=0;
while(p1!=0){//p1!=NULL????
count=0;
while(p0->next->val==p1->val&&p1!=0){
p1=p1->next;count++;
}
if(count==1) p0=p0->next;
p0->next=p1;
}
return np->next;
}
一轮循环以后,原本p0,p1黑色的那两个变成的红色的位置,会发现1,1被挑选出来。继续循环下去,最后返回np->next就OK了。