`

Remove Duplicate from Unsorted List

阅读更多
之前介绍过在排好序的链表中删除节点,只需要遍历一遍链表,所以时间复杂度为O(n)。这篇文章讨论对无序链表的去重问题。

给定一个无序链表,删除里面的重复元素,我们用bruce force来进行的话时间复杂度为O(n^2),我们从头节点开始判断,如果有相等的元素,就将当前节点的next指向下一个节点的next。每个元素都要遍历一次它们后面的元素。代码如下:
public ListNode deleteDuplicates(ListNode head) {
	if(head == null) return head;
	ListNode current = head;
	while(current != null) {
		int value = current.val;
		ListNode find = current;
		while(find.next != null) {
			if(find.next == value) {
				find.next = find.next.next;
			} else {
				find = find.next;
			}
		}
		current = current.next;
	}
	return head;
}


我们也可以先用归并排序将链表排序,然后在去重,这样事件复杂度为O(n + nlogn), 也就是O(nlogn)。代码如下:
public class DeleteDuplicate {
    public ListNode deleteDupli(ListNode head) {
        if(head == null) return null;

        ListNode helper = sort(head);
        while(head.next != null) {
            if(head.val == head.next.val) {
                head.next = head.next.next;
            } else {
                head = head.next;
            }
        }
        return helper;
    }

    public ListNode sort(ListNode head) {
        if(head == null || head.next == null) return head;
        ListNode fast = head;
        ListNode slow = head;
        while(fast.next != null && fast.next.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }
        ListNode next = slow.next;
        slow.next = null;
        ListNode a = sort(next);
        ListNode b = sort(head);
        return merge(a, b);
    }
        
    public ListNode merge(ListNode a, ListNode b) {
        if(a == null) return b;
        if(b == null) return a;
            
        if(a.val > b.val){
            b.next = merge(a, b.next);
            return b;
        } else {
            a.next= merge(a.next, b);
            return a;
        }             
     }
}

分享到:
评论

相关推荐

    Oracle 11gR2 使用 RMAN duplicate from active database 复制数据库

    Oracle 11gR2 使用 RMAN duplicate from active database 复制数据库 Oracle 11gR2 中使用 RMAN duplicate from active database 复制数据库是一种高效的数据库复制方法。这种方法可以直接从活动数据库复制,省去...

    删除重复网址*Remove Duplicate URL*去重复url

    删除重复 去重复url 删除重复网址 remove duplicate url 一个国外的删除重复网址软件

    Remove Duplicate Lines:删除文本文件中的重复行-开源

    "Remove Duplicate Lines" 是一个针对这个问题的开源软件,它提供了一个图形化的用户界面,使得用户能够轻松地从文本文件中删除重复的行,从而提高工作效率。这个工具对于那些需要处理大量文本数据并确保数据唯一性...

    删除List中的重复值

    public static void removeDuplicate(List list) { for ( int i = 0 ; i < list.size() - 1 ; i ++ ) { for ( int j = list.size() - 1 ; j > i; j -- ) { if (list.get(j).equals(list.get(i))) { list....

    Remove Duplicate Email-crx插件

    "Remove Duplicate Email-crx插件"是一款专门针对电子邮件营销领域设计的Chrome浏览器扩展程序。它旨在帮助用户在进行电子邮件营销活动时,有效地去除邮箱列表中的重复条目,从而提高工作效率和邮件发送的准确性。 ...

    LeetCode Remove Duplicates from Sorted Array解决方案

    "LeetCode Remove Duplicates from Sorted Array解决方案" 本文将详细介绍 LeetCode 中的 Remove Duplicates from Sorted Array 解决方案,包括问题描述、解决方案和关键知识点。 问题描述: 给定一个排序的数组 ...

    remove-duplicate-items-js-problem:使用JS删除重复项

    删除重复项目标:此分配的目的是使用迭代器或使用诸如Set内置对象从数组中删除重复项。...Add the remote to the starter codegit remote add starter ...问题如果有任何问题,在处提出问题

    Remove-duplicate-fasta:Python脚本删除重复的Fasta序列

    -Python script to remove whole duplicate fasta sequences i.e identical sequence and header -input file must be in fasta format usage: python remove_duplicate_fasta.py inputfile outputfile 例子: ...

    使用RMAN DUPLICATE...FROM ACTIVE DATABASE 创建物理备库.docx

    【使用RMAN DUPLICATE...FROM ACTIVE DATABASE 创建物理备库】 在Oracle数据库管理中,创建物理备用数据库(Physical Standby Database)是数据保护策略的重要组成部分,主要用于实现Data Guard环境中的灾难恢复和...

    ODIR(Outlook Duplicate Items Remover)自动删除outlook重复邮件注册破解

    面对众多的重复邮件,如何可以快速地删除重复邮件,Outlook Duplicate Items Remover ,快速,简单

    Outlook duplicate items remover

    删除重复邮件,非常好用,使用前务必先关闭OUTLOOK,进去后就好了

    Vistanita Duplicate Finder

    3. Remove any product identification, copyright, proprietary notices or labels from Vistanita Duplicate Finder. 4. Distribute, re-distribute, rent, lease or sell the licensed version of Vistanita ...

    remove_duplicate_files:用于从类似备份目录中删除重复文件的 Python 脚本

    remove_duplicate_files 我有许多包含类似文件的备份。 为了确保我只检查了一次文件,我编写了这个脚本来删除任何重复项。 如果文件位于相同位置,相对于搜索目录,并且具有相同的二进制内容,则文件被视为重复。 ...

    ORACLE Duplicate复制数据库

    RMAN> DUPLICATE TARGET DATABASE TO TESTA FROM ACTIVE DATABASE; ``` #### 注意事项 - 确保目标数据库和辅助数据库的文件路径一致或通过相应的转换参数进行调整。 - 在执行RMAN备份时,需要确保有足够的磁盘...

    Android List删除重复数据

    public static void removeDuplicate(List list) { for (int i = 0; i < list.size() - 1; i++) { for (int j = list.size() - 1; j > i; j--) { if (list.get(j).equals(list.get(i))) { list.remove(j); } }...

    Duplicate File Cleaner 2.5.4.168注册码

    Duplicate File Cleaner是一款功能强大的重复文件清理工具,它能够帮助用户扫描并识别计算机上所有重复的文件,从而节省磁盘空间,提升系统性能。 ### 软件概述 Duplicate File Cleaner的主要功能包括但不限于: ...

    Rman通过duplicate创建standby

    RMAN> DUPLICATE TARGET DATABASE TO standby FROM ACTIVE DATABASE; ``` 这个命令将从活动的主数据库复制所有的结构和数据到备用数据库。 6. **同步备用数据库**: 创建备用数据库后,需要定期使用`switch log...

    FirmTools Duplicate Photo Finder(查找重复图像) 1.2.0一款整理图像的必备工具.rar

    FirmTools Duplicate Photo Finder是一款整理图像的必备工具,它使用高级搜索算法,会快速在您的硬盘或指定文件夹中找到重复或相似的图像,需要的朋友快来下载吧。 FirmTools Duplicate PhotoFinder 使用了先进的...

    ODIR(Outlook Duplicate Items Remover)

    用于去除 outlook 中重复的项目,如 邮件 联系人 日历 之类的 ...好像只能用于 outlook 2007 或 outlook 2003 对于 office 2019 没用 关于 outlook 导出 ics 文件,可以使用 outlook -> 打开日历 -> 主菜单 保存日历 ->...

Global site tag (gtag.js) - Google Analytics