每日一题:LeetCode.面试题 02.01. 移除重复节点

每日一题:LeetCode.面试题 02.01. 移除重复节点
题目描述:
编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。

示例1:输入:[1, 2, 3, 3, 2, 1] 输出:[1, 2, 3]
示例2:输入:[1, 1, 1, 1, 2] 输出:[1, 2]

提示:

链表长度在[0, 20000]范围内。
链表元素在[0, 20000]范围内。

进阶:

如果不得使用临时缓冲区,该怎么解决?

解法一:两层while循环,双指针,也可以说是三指针(暴力解法)
解题思路
以时间换空间,空间复杂度较小,耗时较长
1.快慢双指针,第一层大循环为slow非空的循环,
2.第二层循环为fast循环,prev的下一个始终指向fast,保证出现fast.val==slow.val
时,可以有效的删除相同结点,只需要fast和prev即可完美做到
3.slow和fast双层循环依次进行,slow和fast以及以后的依次比较,直到结束

class Solution {
    public ListNode removeDuplicateNodes(ListNode head) {
        if(head == null || head.next==null) return head;
        ListNode slow = head;
        ListNode fast = head;
        ListNode prev;
        while(slow!=null){
            fast  = slow.next;
            prev = slow;
            while(fast!=null){
                if(fast.val==slow.val)
                    prev.next = fast.next;
                else
                    prev = prev.next;
                fast = fast.next;
            }
            slow = slow.next;
        }
        return head;
    }
}

解法二:继承上面算法一的内层循环的两个指针,哈仪表存储检验
解题思路
1.HashSet中存入未曾出现的元素,prev和current依次向后推进
2.HashSet出现出现过的元素,使用prev和current删除重复结点
3.只用单层循环即可完成目标
注:prev可以定义为头结点,也可以定义为head,修改小部分代码,即可完成

代码

class Solution {
    public ListNode removeDuplicateNodes(ListNode head) {
        if(head == null || head.next == null ) return head;
        ListNode current = head;
        ListNode prev = new ListNode(0);
        prev.next = head;
        Set s = new HashSet();
        while(current!=null){
            if(!s.contains(current.val)){
                s.add(current.val);
                prev = current;
            }
            else{
                prev.next = current.next;
            }
            current=current.next;
        }
        return head;
    }
}

文章持续更新:欢迎各位小伙伴关注我的公众号:菜丸的程序屋。希望将我的不足之处给予指点,谢谢大家。喜欢Java,热衷学习的小伙伴可以加我微信: CaiWan_Y
每日一题:LeetCode.面试题 02.01. 移除重复节点_第1张图片
每日一题:LeetCode.面试题 02.01. 移除重复节点_第2张图片

你可能感兴趣的:(每日一题:LeetCode.面试题 02.01. 移除重复节点)