【一次过】Lintcode 217. 无序链表的重复项删除

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
    }
}

猜你喜欢

转载自blog.csdn.net/majichen95/article/details/86600212