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

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

题目描述

题目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;
    }
}
目录
相关文章
|
5月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
56 1
|
5月前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
77 0
Leetcode第21题(合并两个有序链表)
|
5月前
【LeetCode 27】347.前k个高频元素
【LeetCode 27】347.前k个高频元素
59 0
|
5月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
51 0
LeetCode第二十四题(两两交换链表中的节点)
|
5月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
61 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
5月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
132 0
|
9月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
9月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
9月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
78 2
|
10月前
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点.
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点
97 1