算法笔记 -- 83. 删除排序链表中的重复元素

96 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

一、题目描述:

83. 删除排序链表中的重复元素 - 力扣(LeetCode) (leetcode-cn.com)

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

示例 1: image.png

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

示例 2:

image.png

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

提示:

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

二、思路分析:

两种方法:

  1. 定义指针,遍历整个链表
    如果next节点值不为空,将当前值和下一个节点的值进行比较,如果相等 删除next节点 如果不相等,则当前节点指针后移
    直到遍历退出循环,返回head节点即可
  2. 递归的进行遍历。对于head.next节点来说,又相当于删除后续链表的所有重复节点,可以直接进行递归调用
    最后,返回值需要先对head和head.next的值进行判断 是否相等

两种方法都需要在开始之前对边界条件进行判断 head和head.next是否为空

三、AC 代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        // // 判断边界条件
        // if(head == null || head.next == null){
        //     return head;
        // }
        // // 定义当前指针 用于判断是否和下一个节点值相等
        // ListNode currentNode = head;
        // while(currentNode.next != null){
        //     if(currentNode.next.val == currentNode.val){
        //         currentNode.next = currentNode.next.next;
        //     }else{
        //         currentNode = currentNode.next;
        //     }
        // }
        // // 循环退出之后 表明当前已经遍历到了最后
        // return head;


        // 递归方法 每次移动之后就相当于 对于剩余链表进行去重,可以分割成重复的子问题
        if(head == null || head.next == null){
            return head;
        }
        // 递归调用,这里直接获取了头结点的next,还没有对head和head.next二者的值进行判断
        head.next = deleteDuplicates(head.next);
        // 最后需要对头结点进行判断
        if(head.val == head.next.val){
            return head.next;
        }else{
            return head;
        }

    }
}