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

84 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情

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

一、题目描述:

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

示例 1:

img

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

img

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

提示:

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

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

二、思路分析:

  1. 这道题考察了什么思想?你的思路是什么?

    这道题目我的思路是每个节点都判断下一个节点的是不是与这个节点的值相等,如果相等就把该节点的next指向下一个节点的next。如果不相等,就判断下一个节点。

  2. 做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

    不是一次通过的,刚开始我是这样写的,运行就出现了一个问题:

    image-20220409163104426

     /**
      * Definition for singly-linked list.
      * struct ListNode {
      *     int val;
      *     struct ListNode *next;
      * };
      */
     ​
     ​
     struct ListNode* deleteDuplicates(struct ListNode* head){
         if(head == NULL){
             return head;
         }
     ​
         while(head->next != NULL){
             if(head->val == head->next->val){
                 head->next = head->next->next;
             }else{
                 head = head->next;
             }
         }
     ​
         return head;
     }
    

    此时指针已经指向了最后一个节点,所以我们得保留首节点的位置。具体操作看AC代码1。

  3. 有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

    还可以用深度优先算法来做!

     class Solution {
         public ListNode deleteDuplicates(ListNode head) {
             if (head == null || head.next == null) return head;
             
             if (head.val == head.next.val) {
                 return deleteDuplicates(head.next);
             } else {
                 head.next = deleteDuplicates(head.next);
                 return head;
             }
         }
     }
    

三、AC 代码:

 /**
  * Definition for singly-linked list.
  * struct ListNode {
  *     int val;
  *     struct ListNode *next;
  * };
  */
 ​
 ​
 struct ListNode* deleteDuplicates(struct ListNode* head){
     if(head == NULL){
         return head;
     }
     struct ListNode* head_node = head;
     while(head->next != NULL){
         if(head->val == head->next->val){
             head->next = head->next->next;
         }else{
             head = head->next;
         }
     }
 ​
     return head_node;
 }

image-20220409180307156

image-20220409180316468

四、总结:

这道题目的深度优先算法解法有助于我们学习如何使用深度优先算法来解决问题。如果不能理解建议通过调试来理解。