zoukankan      html  css  js  c++  java
  • [CareerCup] 2.1 Remove Duplicates from Unsorted List 移除无序链表中的重复项

    2.1 Write code to remove duplicates from an unsorted linked list.
    FOLLOW UP
    How would you solve this problem if a temporary buffer is not allowed?

    这道题让我们移除无序链表中的重复项,在LeetCode中有两道类似的题是Remove Duplicates from Sorted List 移除有序链表中的重复项 和 Remove Duplicates from Sorted List II 移除有序链表中的重复项之二。这两道都是针对有序链表的,而这道题是针对无序链表的,其实难度也不是很大。很多对于链表的处理的题都需要在头结点前建立一个dummy node,目的是为了防止头结点被移除,没法返回新的头结点位置。而这道题不用,因为此题让我们删除重复的节点,不是全删掉,而是会保留一个,那么不管头结点有没有重复项,都会保留下来。这题我们可以用哈希表来解,思路是对于每一个节点,如果在哈希表中存在,则删掉,若不存在,则加入哈希表,参见代码如下:

    class Solution {
    public:
        ListNode *deleteDuplicates(ListNode *head) {
            ListNode *pre = NULL, *cur = head;
            int m[256] = {0};
            while (cur) {
                if (m[cur->val] > 0) {
                    pre->next = cur->next;
                } else {
                    ++m[cur->val];
                    pre = cur;
                }
                cur = cur->next;
            }
            return head;
        }
    };

    这道题的Follow Up让我们不要用额外空间,即空间复杂度应为O(1),那么我们需要两个while循环来解,同时需要两个指针,第一个指针指向一个节点,第二个指针从下一个为位置开始遍历到链表末尾,遇到相同的就删掉。以此类推直到第一个指针完成链表的遍历即可删掉所有的重复项,整体的思路和冒泡排序有些类似,但是这种方法的时间复杂度为O(n2),是一种以时间来换取空间的方法,参见代码如下:

    class Solution {
    public:
        ListNode *deleteDuplicates(ListNode *head) {
            ListNode *pre = head, *cur = head;
            while (pre) {
                cur = pre->next;
                while (cur) {
                    if (cur->val == pre->val) {
                        pre->next = cur->next;
                    }
                    cur = cur->next;
                }
                pre = pre->next;
            }
            return head;
        }
    };
  • 相关阅读:
    MySQL执行外部sql脚本文件的命令
    如何修改mysql 默认引擎为InnoDB?
    最新版的 vscode 怎么配置 Python?
    Go 后端主要做什么
    Go 语言 fmt.Sprintf (格式化输出)
    什么是弱类型语言、强类型语言?
    一个项目从立项到发布的流程
    工厂模式
    观察模式
    类之间的关系
  • 原文地址:https://www.cnblogs.com/grandyang/p/4656399.html
Copyright © 2011-2022 走看看