前言
提示:这里可以添加本文要记录的大概内容:
这道题是面经上看到的,美团面试出的一道面试题,也是leetcode上面一道中等难度的题目,总结起来基本上面试算法是必考的,难度也在容易和中等之间挑选。所以想进大厂,算法必须过关。
提示:以下是本篇文章正文内容,下面案例可供参考
一、题目
82. 删除排序链表中的重复元素 II—LeetCode题目地址: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;
}
}
总结
感觉只要是去除或查找链表或者数组中的重复值都可以用这种方法。