面试题 02.01. 移除重复节点
编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
示例1:
输入:[1, 2, 3, 3, 2, 1]
输出:[1, 2, 3]
示例2:
输入:[1, 1, 1, 1, 2]
输出:[1, 2]
提示:
链表长度在[0, 20000]范围内。
链表元素在[0, 20000]范围内。
进阶:
如果不得使用临时缓冲区,该怎么解决?
HashSet 缓冲区方法
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeDuplicateNodes(ListNode head) {
if(head == null){
return head;
}
ListNode t = head;
Set<Integer> set = new HashSet<>();
set.add(head.val);
while(head.next!=null){
if(!set.contains(head.next.val)){
set.add(head.next.val);
head = head.next;
}else{
head.next = head.next.next;
}
}
return t;
}
}
快慢双指针方法O(n2^22)时间复杂度
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeDuplicateNodes(ListNode head) {
if(head == null){
return head;
}
ListNode res = head;
ListNode slow = head;
while(slow!=null){
ListNode fast = slow;
while(fast!=null&&fast.next!=null){
if(fast.next.val == slow.val){
fast.next = fast.next.next;
}else{
fast = fast.next;
}
}
slow = slow.next;
}
return res;
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicate-node-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
本文介绍了一种算法,用于从未排序的链表中移除重复节点,同时保持首次出现的节点。提供了两种解决方案,一种使用HashSet缓冲区,另一种采用快慢双指针方法。适用于链表长度和元素在[0,20000]范围内的场景。
405

被折叠的 条评论
为什么被折叠?



