版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/majichen95/article/details/86600212
设计一种方法,从无序链表中删除重复项。
样例
样例 1:
输入:1->2->1->3->3->5->6->3->null
输出:1->2->3->5->6->null
样例 2:
输入:2->2->2->2->2->null
输出:2->null
挑战
如果没有临时缓冲区,如何解决这一问题?
解题思路1:
利用HashSet来去重。时间复杂度O(n),空间复杂度O(n)
/**
* Definition for ListNode
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
/**
* @param head: The first node of linked list.
* @return: Head node.
*/
public ListNode removeDuplicates(ListNode head) {
// write your code here
Set<Integer> set = new HashSet<>();
ListNode node = new ListNode(0);
ListNode newHead = node;
while(head != null){
if(!set.contains(head.val)){
set.add(head.val);
node.next = head;
node = node.next;
}
head = head.next;
}
node.next = null;
return newHead.next;
}
}
解题思路2:
利用两指针套两层循环即可。时间复杂度O(n*n),空间复杂度O(1)
注意删除掉p2节点后,p2Pre节点不要移动,才能保持在p2节点前
/**
* Definition for ListNode
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
/**
* @param head: The first node of linked list.
* @return: Head node.
*/
public ListNode removeDuplicates(ListNode head) {
// write your code here
if(head == null)
return null;
//p1用来遍历节点
ListNode p1 = head;
while(p1 != null){
ListNode p2Pre = p1; //p2Pre指向p2的前一个元素
ListNode p2 = p1.next; //p2作为二次遍历,寻找与p1相同的元素
while(p2 != null){
if(p2.val == p1.val){//如果p1节点与p2节点相同,则利用p2Pre删除掉p2节点
p2Pre.next = p2.next;
}else{ //如果没找到则继续向下遍历
p2Pre = p2;
}
p2 = p2.next;
}
p1 = p1.next;
}
return head;
}
}