1

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

大家好,我是灵魂画师--茄子。技术水平一般,喜欢画画。

开始今天的正题。

leetCode82删除排序链表中的重复元素||

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

示例 1:

输入: 1->2->3->3->4->4->5
输出: 1->2->5

示例 2:

输入: 1->1->1->2->3
输出: 2->3

解法:

1.快慢指针解法

思路:

  1. 设立一个慢指针,设立一个快指针
  2. 快指针用来跳过重复数字,记录下一个不重复的节点位置
  3. 慢指针,标记重复数字前一个节点,用来跟快指针相连接

图解

let deleteDuplicates = function(head) {
    let dummyHead = new ListNode(); // 设置哨兵节点
    dummyHead.next =head; 
    let slow = dummyHead; // 设置慢指针
    let quick = head; // 设置快指针
    while(quick){
        if(quick.next && quick.val === quick.next.val){
            // 如果值相同的话,保留这个值作为对比,让快指针前进
            let val = quick.val;
            console.log(val)
            while(quick && val === quick.val){ // 这里注意边界条件的判断,当快指针前进到最后一个的时候是null
                quick = quick.next
                console.log('quick',quick)
            }
            
        } else{
            // 如果值不相同的话,前进快慢指针
            // 这里要注意,快慢指针可能存在不挨着的情况,所以需要指向一下slow.next
            slow.next = quick;
            slow = quick;
            quick = quick.next;
        }
    }
    slow.next = quick;
    return dummyHead.next;
};

2.递归解法

思路:

  1. 判断当前递归项的终止条件(head == null)
  2. 判断head.next与head.next的下一项是否相同,如果相同的话让head = head.next
let deleteDuplicates = function(head) {
    if(head == null){ // 递归的终止条件
        return head;
    }
    if(head.next && head.val === head.next.val){
        while(head.next && head.val === head.next.val){
            head = head.next;
        }
        return deleteDuplicates(head.next); // 这句话很关键,传入的是head.next head的下一项,不是当前项,如果传入的是当前项的话,会导致1->2->3->3->5->NULL 变为 1->2->3->5->NULL
    } else {
        head.next = deleteDuplicates(head.next);
    }
    return head;
};

结合我的分析你是不是对这道题有了更清晰的认识了呢?

以上就是我的思路以及解法了,希望大家喜欢我画的图解,我会继续努力的ヾ(◍°∇°◍)ノ゙。(点个赞把我带走吧~~)


灵魂画师_茄子
11 声望4 粉丝