82. 删除排序链表中的重复元素 and II

链接直达:

保留重复元素

不保留重复元素

题目:

1:

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

 

示例 1:


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


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

提示:

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

2:

复制代码
给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。

 

示例 1:


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


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

提示:

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

1题解:

java 复制代码
/**
 * 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 dummy = new ListNode(0);
        dummy.next = head;
        ListNode prev = dummy;
        ListNode curr = head;

        while (curr != null) {
            // 找到当前值与下一个值不同的节点
            while (curr.next != null && curr.val == curr.next.val) {
                curr = curr.next;
            }
            prev.next=curr;
            prev=prev.next;
            curr = curr.next;
        }

        return dummy.next;
    }
}

2题解:

java 复制代码
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }

        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode prev = dummy;
        ListNode curr = head;

        while (curr != null) {
            // 找到当前值与下一个值不同的节点
            while (curr.next != null && curr.val == curr.next.val) {
                curr = curr.next;
            }

            // 如果当前节点的下一个节点与当前节点的值不同,则将当前节点连接到prev
            if (prev.next == curr) {
                prev = curr;
            } else {
                // 否则跳过所有重复的节点
                prev.next = curr.next;
            }

            curr = curr.next;
        }

        return dummy.next;
    }
}

至于具体两者有什么区别呢,第一道算法题是保留了重复元素,也就是最后的结果是链表中每个出现的数据都是唯一的,而第二道算法题则是去掉了重复的数据,只保留了只出现过一次的数据。

两道题解的不同之处是:

第一道:

java 复制代码
            prev.next=curr;
            prev=prev.next;
            curr = curr.next;

第二道:

java 复制代码
// 如果当前节点的下一个节点与当前节点的值不同,则将当前节点连接到prev
            if (prev.next == curr) {
                prev = curr;
            } else {
                // 否则跳过所有重复的节点
                prev.next = curr.next;
            }

也就是第一道是prev的下一个节点直接指向了重复节点,而第二道则是如果判断当前节点不唯一的话就直接指向了重复节点的下一个节点。








近日总结:下下周考试,难受,还是建议预备大学生们,当你选择的专业涉及到技术,需要下载各种技术软件的话,电脑系统还是选择windows比较好,有不少技术软件居然不支持mac。

相关推荐
wen__xvn7 小时前
模拟题刷题3
java·数据结构·算法
Neteen7 小时前
【数据结构-思维导图】第二章:线性表
数据结构·c++·算法
礼拜天没时间.7 小时前
力扣热题100实战 | 第25期:K个一组翻转链表——从两两交换到K路翻转的进阶之路
java·算法·leetcode·链表·递归·链表反转·k个一组翻转链表
故事和你919 小时前
sdut-程序设计基础Ⅰ-实验二选择结构(1-8)
大数据·开发语言·数据结构·c++·算法·优化·编译原理
像素猎人10 小时前
数据结构之顺序表的插入+删除+查找+修改操作【主函数一步一输出,代码更加清晰直观】
数据结构·c++·算法
季明洵10 小时前
二叉树的最小深度、完全二叉树的节点个数、平衡二叉树、路径总和、从中序与后序遍历序列构造二叉树
java·数据结构·算法·leetcode·二叉树
小龙报10 小时前
【算法通关指南:算法基础篇】二分算法: 1.A-B 数对 2.烦恼的高考志愿
c语言·开发语言·数据结构·c++·vscode·算法·二分
靠沿11 小时前
【优选算法】专题九——链表
数据结构·算法·链表
叶宇燚12 小时前
Java整理--数据结构篇
java·开发语言·数据结构
晚枫歌F12 小时前
btree B树实现key-value存储
开发语言·数据结构