【LeetCode】 链表

83. 删除排序链表中的重复元素

题目描述

给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

示例 1:

输入: 1->1->2
输出: 1->2
示例 2:

输入: 1->1->2->3->3
输出: 1->2->3

方法一 迭代

思路

遍历结点,如果当前结点值和下一个结点值相等,则删除下一个结点;否则继续遍历下一个结点

代码

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        ListNode *p = head;
        while(p!=NULL and p->next!=NULL){
            if(p->next->val==p->val){
                p->next = p->next->next;
  
            }
            else{
                p = p->next;
            }
        }
        
        return head;
        
    }
};

方法二 递归

思路

递归我们不用纠结每一级调用和返回的细节,做递归我们只需要关注以下三点:

  • 整个递归的终止条件:递归应该在什么时候结束
  • 本级递归需要做什么:在这一级递归中应该完成什么任务
  • 找返回值:应该给上一级返回什么信息

比如这道题我们的终止条件就是head指向链表只剩下一个元素的时候,这个时候只有一个结点则不存在重复了;第二步,我们在本级递归需判断当前的值和下一个结点的值是否重复;第三步:返回的是当前的head

代码

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        
        //第一步:找终止条件,head指向链表只剩下一个元素的时候
        if(head==NULL or head->next==NULL){
            return head;
        }
        //第二步: 本级递归需要做什么
        head->next = deleteDuplicates(head->next);
        if(head->val==head->next->val){
            head = head->next;
        }
        //第三步:返回值是什么
        return head;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值