力扣每日一题:83. 删除排序链表中的重复元素

目录

  • 题目:83. 删除排序链表中的重复元素
    • 示例1
    • 示例2
    • 提示
  • 解题思路
  • 解题代码
  • 解题感悟

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

难度: 简单

题目
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素只出现一次

返回同样按升序排列的结果链表。

示例1

力扣每日一题:83. 删除排序链表中的重复元素_第1张图片

输入:head = [1,1,2]
输出:[1,2]

示例2

力扣每日一题:83. 删除排序链表中的重复元素_第2张图片

输入:head = [1,1,2,3,3]
输出:[1,2,3]

提示

  • 链表中节点数目在范围 [0, 300] 内
  • -100 <= Node.val <= 100
  • 题目数据保证链表已经按升序排列

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。



解题思路

  删除排序链表的重复元素,该题和82. 删除排序链表中的重复元素 II类似,不过该题保留重复元素一个。沿用前题的思路,可以在找到相同元素时,删除该元素后几个相同的元素。当然,对于本题而言,可以直接判断当前元素和下一个元素的关系,相同则删除下一元素,操作更加简便。
  因为上一题是该元素本身也要删除,就是不保留所有相同的元素,因而采用虚拟头结点的方式,判断下一元素和下下元素来操作会简单。也就是说,上一题需要当前结点的上一结点的元素,才能通过修改next指针的指向删除当前结点。而本题由于当前结点可以保留就不需要了。

解题代码

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {

        /* 比较复杂的解法,脱胎上一题的解法
        ListNode *newHead = new ListNode(-1, head);
        ListNode *cur = newHead->next;


        while(cur && cur->next)
        {

            if(cur->val == cur->next->val)
            {
                int x = cur->val;
                while(cur->next && cur->next->val == x)
                {
                    cur->next = cur->next->next;
                }
            }
            else
            {
                cur = cur->next;
            }
        }
        return newHead->next;
        */
        if(!head)
            return nullptr;

        ListNode *cur = head;
        while(cur->next)
        {
            if(cur->val == cur->next->val)
            {
                cur->next = cur->next->next;
            }
            else
            {
                cur = cur->next;
            }
        }
        return head;
    }
};

解题感悟

  掌握了一种解题技巧,用于同类题目时都具有异曲同工之妙。相信如果上一题理解清除的话解该题会很轻松。

你可能感兴趣的:(leetcode,leetcode,链表,数据结构,算法)