【LeetCode】第15天 - 83. 删除排序链表中的重复元素 | 82. 删除排序链表中的重复元素 II

简介: 83. 删除排序链表中的重复元素 | 82. 删除排序链表中的重复元素 II

@TOC

题目描述

题目1(83. 删除排序链表中的重复元素)

在这里插入图片描述

题目2(82. 删除排序链表中的重复元素 II)

在这里插入图片描述

解题思路

题目1(83. 删除排序链表中的重复元素)

使用指针pre遍历链表,比较当前 pre.val与 pre.next.val是否相同,如果相同则删除pre.next节点(pre.next = pre.next.next)。

题目2(82. 删除排序链表中的重复元素 II)

  • 使用三个指针(left,mid,right)遍历链表,如果mid.val与left.val和right.val都不相等,则将mid节点插入到新链表的链尾。
  • 对于第一个节点,只需要比较它与第二个节点的元素是否相同,如果不同,则将第一个节点插入到新链表的链尾。
  • 同理,对于最后一个节点,只需要比较它与倒数第二个节点的元素是否相同,如果不同,则将最后一个节点插入到新链表的链尾。

在这里插入图片描述

代码实现

题目1(83. 删除排序链表中的重复元素)

/**
 * 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) {
        //链表为空或只有一个节点时,直接返回head
        if (head == null || head.next == null) {
            return head;
        }

        ListNode pre = head;
        while (pre.next != null) {
            if (pre.val == pre.next.val) {
                pre.next = pre.next.next;    //删除pre.next指针
            } else {
                pre = pre.next;
            }
        }

        return head;
    }
}

题目2(82. 删除排序链表中的重复元素 II)

/**
 * 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) {
            //链表为空或只有一个节点时,直接返回head
        if(head == null || head.next == null) return head;
        //链表只有两个节点时,只需比较前两个节点
        if(head.next.next == null){
            if(head.val == head.next.val) return null;
            else return head;
        }
        ListNode res = new ListNode(0);
        ListNode temp = res;
        ListNode left = head;
        ListNode mid = head.next;
        ListNode right = head.next.next;
        //针对第一个和第二个节点的比较
        if(head.val != head.next.val){
            temp.next = head;
            temp = head;
        }
        while(right != null){
            if(mid.val != left.val && mid.val != right.val){
                temp.next = mid;
                temp = mid;
            }
            left = left.next;
            mid = mid.next;
            right = right.next;
        }
        //遍历结束时,mid和left就分别指向最后一个和倒数第二个节点
        //针对最后一个和倒数第二个节点的比较
        if(mid.val != left.val){
            temp.next = mid;
            temp = mid;
        }
        temp.next = null;

        return res.next;
    }
}
目录
相关文章
|
1月前
|
程序员
【刷题记录】移除链表元素
【刷题记录】移除链表元素
|
1月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
1月前
|
算法 索引
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
这篇文章介绍了LeetCode第34题"在排序数组中查找元素的第一个和最后一个位置"的解题方法,通过使用双指针法从数组两端向中间同时查找目标值,有效地找到了目标值的首次和最后一次出现的索引位置。
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
|
1月前
|
存储 C语言
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer II 082. 含有重复元素集合的组合
解决LeetCode平台《剑指 Offer II 082. 含有重复元素集合的组合》题目的Python代码实现,通过深度优先搜索算法找出所有和为特定目标值的数字组合,并在搜索过程中通过排序和跳过重复元素来避免解集中出现重复组合。
30 2
|
1月前
|
算法
LeetCode第27题移除元素
这篇文章介绍了LeetCode第27题"移除元素"的解题方法,通过使用双指针技巧,有效移除数组中特定值的元素并返回新数组的长度。
|
1月前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
18 0
|
1月前
|
算法 索引 Python
【Leetcode刷题Python】34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)
解决LeetCode "在排序数组中查找元素的第一个和最后一个位置" 问题的方法。第一种方法是使用两次二分查找,首先找到目标值的最左边界,然后找到最右边界。第二种方法是利用Python的list.index()方法,先正序找到起始位置,再逆序找到结束位置,并给出了两种方法的Python实现代码。
43 0
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
41 6
|
1月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
73 2