我在接受采访时被问到这个问题。
例如,如果给定list1: 1,1,2,4,5,7
和list2: 1,3,5,8
,我们应该返回list3: 2,4,7
。
问题需要恒定的空间,我们需要尽可能地减少时间复杂度。
答案 0 :(得分:3)
我们只是同时浏览两个列表 - 使用两个"指针"进入他们 - 比较当前的两个元素。
当第一个列表的当前元素小于第二个列表时,我们在结果的末尾复制第一个列表的当前元素并前进第一个指针
当第一个列表的当前元素大于第二个列表时,我们前进第二个指针。
当它们相等时,我们前进第一个指针。
第一个指针到达列表末尾时停止。如果第二个指针首先执行此操作,也会逐个复制list1
个result
端的所有剩余元素,或者 - 如果这些是singly linked lists允许共享结构 - 将结果的结束指针指向第一个指针的值。
假设result
是链接列表或其他具有 O(1) add-at-end
操作的数据结构,这给了我们 O(n +)的复杂性m)其中 n , m 是两个列表'长度。
此操作在list1 \ list2
方面称为list2
的设置差异list1
或relative set complement。
使用的两个指针构成算法使用的常量辅助空间。