【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月前
《剑指offer》——合并两个排序的链表
《剑指offer》——合并两个排序的链表
【移除链表元素】LeetCode第203题讲解
【移除链表元素】LeetCode第203题讲解
|
8天前
【力扣】21. 合并两个有序链表
【力扣】21. 合并两个有序链表
|
1月前
|
存储 JavaScript
leetcode82. 删除排序链表中的重复元素 II
leetcode82. 删除排序链表中的重复元素 II
22 0
|
1月前
leetcode83. 删除排序链表中的重复元素
leetcode83. 删除排序链表中的重复元素
10 0
|
1月前
leetcode2807.在链表中插入最大公约数
leetcode2807.在链表中插入最大公约数
16 0
|
1月前
leetcode2487.从链表中移除节点
leetcode2487.从链表中移除节点
20 1
|
1月前
|
存储 算法
LeetCode刷题--- 61. 旋转链表(快慢指针+闭合为环)
LeetCode刷题--- 61. 旋转链表(快慢指针+闭合为环)
|
26天前
|
机器学习/深度学习 算法
力扣刷题日常(一)
力扣刷题日常(一)
20 2
|
1月前
|
存储 索引
《LeetCode》—— LeetCode刷题日记
《LeetCode》—— LeetCode刷题日记

热门文章

最新文章