算法刷题Day10

本文介绍了美团面试中的一道算法题目,要求从已排序链表中删除重复元素,保持链表有序。作者采用笨方法,使用TreeMap存储节点值及其出现次数,然后遍历map以创建新链表,最后返回不包含重复值的新链表头节点。
摘要由CSDN通过智能技术生成

前言

提示:这里可以添加本文要记录的大概内容:
这道题是面经上看到的,美团面试出的一道面试题,也是leetcode上面一道中等难度的题目,总结起来基本上面试算法是必考的,难度也在容易和中等之间挑选。所以想进大厂,算法必须过关。

提示:以下是本篇文章正文内容,下面案例可供参考

一、题目

82. 删除排序链表中的重复元素 IILeetCode题目地址:https://leetcode.cn/problems/remove-duplicates-from-sorted-list-ii/description/
题目内容:
给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。

示例 1:
在这里插入图片描述

输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]
示例 2:
在这里插入图片描述

输入:head = [1,1,1,2,3]
输出:[2,3]

提示:
链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序 排列

二、解题思路

这道题我同样是用我的笨方法,虽然麻烦,但至少能做出来:
(1)收集各个结点的值放在map集合的key中,同时把该结点值出现的次数放在value里面。这里需要用TreeMap集合,因为要保证他的有序性,后面要按照这个顺序建立新的链表。
(2)遍历map集合,通过判断每个key的value是否为1,如果等于1说明只有一个结点,不存在重复的结点,则利用尾插法建表,再用尾插法建表的时候这里提前建立了一个头节点,方便尾插法建表。最后只需要通过头节点后移一位指向首结点,并返回该首结点即可。

二、代码实现

代码实现:

/**
 * 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) {
               if(head==null)
               return head;
               ListNode p=head;
               ListNode node=new ListNode(-1,null);
               head=node;
               ListNode q=node;
               Map <Integer,Integer> map=new TreeMap();
               while(p!=null)
               {
                 if(map.containsKey(p.val)){
                  map.put(p.val,map.get(p.val)+1);
                 }else{
                    map.put(p.val,1);
                 }
                 p=p.next;
               }
               Set<Integer> set=map.keySet();
               for(Integer listnode:set){
                   if(map.get(listnode)==1)
                   {
                     ListNode newnode =new ListNode(listnode,null); 
                     q.next=newnode;
                     q=q.next;
                   }
               }
               head=head.next;
               return head;

    }
}

总结

感觉只要是去除或查找链表或者数组中的重复值都可以用这种方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值