Leecode-82. 删除排序链表中的重复元素 II(通俗易懂,两种解法,击败90%)

这篇博客详细介绍了如何解决LeetCode中的82题,即删除排序链表中的重复元素II。通过两种解法,包括简单的模拟遍历和递归方法,解释了如何删除链表中所有重复的数字节点,同时提供了Java实现代码及复杂度分析。在模拟解法中,重点在于遍历链表并跳过重复节点;递归解法则通过处理特殊情况,不断删除相等的头节点直至找到不同值的节点,然后对下一节点进行递归操作。两种方法的时间复杂度均为O(N),空间复杂度为O(1)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

示例 1:

输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:

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

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

解题思路一(简单模拟)

  1. 当链表为空或链表节点的个数为一时,不可能存在重复元素,直接返回头节点。
  2. 用一个指针来遍历链表,如果当前指针不为空,且当前指针的下一个节点不为空,且两着的值相等,则证明存在两个值相同的节点,用当前指针的next指向当前指针下一个指针的next来删除当前指针的下一个节点(cur.next=cur.next.next),直到当前指针的下一个节点值与当前指针值不相同。
  3. 完成第二步后,所有与当前指针值相同的链表节点已经被删除,此时需要在链表中删除当前指针指向的节点,即可完成对值为cur.val所有节点的删除,故在遍历链表时,还需记录下当前指针的前一个指针。
  4. 如果当前指针为链表中的第一个节点,还需注意要修改头指针节点的指向,而且需要注意链表可能最开始的几段都是由相同的数字构成,比如1-1-1-2-2-2-3-3-3-3-4-5,故对头指针的修改可能不止一次。

实现代码(Java)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
   
    public ListNode deleteDuplicates(ListNode head) {
   
        ListNode pre,cur;
        if(head==null||head.next==null)
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值