LeetCode CodeTop 82.删除排序链表中的重复元素Ⅱ

1.思路:两个指针分别指向cur.next和cur.next.next,如果发现重复就一次性删除所有值为val的节点;否则cur正常前进一位。

2.复杂度分析:

(1)时间复杂度:O(n),其中n为链表的长度。

(2)空间复杂度:O(1),仅用到若干额外变量。

附代码:

java 复制代码
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        ListNode sentinel = new ListNode();
        sentinel.next = head;
        ListNode cur = sentinel;
        while(cur.next != null && cur.next.next != null){
            int val = cur.next.val;
            // 后两个节点值相同,都为val
            if(val == cur.next.next.val){
                // 从第一个值等于val的节点开始,将值等于val的节点全部删除
                while(cur.next != null && cur.next.val == val){
                    cur.next = cur.next.next;
                }
            }else{
                cur = cur.next;
            }
        }
        return sentinel.next;
    }
}

ACM模式:

java 复制代码
import java.util.Scanner;

// 将 ListNode 定义为独立的类
class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) {
        this.val = val;
        this.next = null;
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取链表长度
        int n = scanner.nextInt();

        // 读取链表元素
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = scanner.nextInt();
        }

        // 创建链表
        ListNode head = null;
        if (n > 0) {
            head = new ListNode(nums[0]);
            ListNode current = head;
            for (int i = 1; i < n; i++) {
                current.next = new ListNode(nums[i]);
                current = current.next;
            }
        }

        // 调用删除重复元素方法
        Solution solution = new Solution();
        ListNode result = solution.deleteDuplicates(head);

        // 输出删除重复后的链表
        if (result == null) {
            System.out.println("");
        } else {
            ListNode current = result;
            while (current != null) {
                System.out.print(current.val);
                if (current.next != null) {
                    System.out.print(" ");
                }
                current = current.next;
            }
            System.out.println();
        }

        scanner.close();
    }
}

// 删除重复元素方法放在 Solution 类中
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        ListNode sentinel = new ListNode();
        sentinel.next = head;
        ListNode cur = sentinel;
        while (cur.next != null && cur.next.next != null) {
            int val = cur.next.val;
            // 后两个节点值相同,都为val
            if (val == cur.next.next.val) {
                // 从第一个值等于val的节点开始,将值等于val的节点全部删除
                while (cur.next != null && cur.next.val == val) {
                    cur.next = cur.next.next;
                }
            } else {
                cur = cur.next;
            }
        }
        return sentinel.next;
    }
}
相关推荐
OPEN-F30 分钟前
C++11/14新特性精讲:移动语义与智能指针实战
开发语言·c++·算法
lisin-lee-cooper1 小时前
【leetcode658】有序数组找出k个最接近x的数
java·数据结构·算法
sunburn-1 小时前
Java堆(Heap)详解与实战教学
java·开发语言·数据结构·ide·算法
智碳能碳管理平台2 小时前
工业能耗台账标准化:能碳管理系统的数据口径怎么设计
算法·能碳管理系统·智碳能碳管理平台·企业能碳管理系统·碳排放核算软件·绿色工厂申报saas·能碳管理平台
带多刺的玫瑰2 小时前
Leecode#15刷题之三数之和
算法·leetcode·职场和发展
圣保罗的大教堂2 小时前
leetcode 877. 石子游戏 中等
leetcode
哭泣方源炼蛊2 小时前
并查集进阶 P1(带权并查集,并查集分类)
数据结构·c++·算法·二进制·带权并查集
牧羊人.3333 小时前
动手学深度学习 02 | 手写数字识别
图像处理·人工智能·深度学习·算法
武帝为此3 小时前
【InnoDB存储引擎介绍】
数据库·算法
shehuiyuelaiyuehao4 小时前
算法32,连续数组,前缀和+哈希表
算法·leetcode·职场和发展