《数据结构与算法》(二)JAVA链表实现O(N) 时间复杂度的两个有序序列求交集和并集

一、基础条件

  1. 结合迭代器,使用链表,可以做到删除和插入元素都只需要O(1) 的时间开销
  2. 数据合理(有序,无重复)

二、并集

  1. 在其中一个链表A上通过迭代器迭代遍历,与另一个链表B通过迭代器遍历比较;
  2. 由于JAVA链表是双链表实现,很容易得到链表A的next指针的前后置节点的值(L和R,其中:L < R);
  3. 以此为区间比较链表B的next指针指向的值 -> K;( K != L ,K != R)
  4. 如果 K < L,K 值插入链表A,链表B往前走,更新next指针刷新 K 值;
  5. 如果L < K < R,K插入链表A,L的值更新为原K的值,B链表刷新K值;
  6. 如果L < R < K,L赋值为原R,R值刷新为链表A的next指向的值;
  • 根据上述原理,直至两个链表都迭代完成,如果A长度为N,B长度为M;
  • 总花费时间:O(N) + O(M),只保留最高次幂,最终:T(N) = O(N);

三、交集
交集原理就更简单了,还是迭代器,找一个链表作为参照,两个分别迭代,没当交点就跳过,否则就移除,两个链表都走完之后,参照链表删完非交点后剩下的就是交集了。
时间复杂度,还是取最高次幂:
T(N) = O(N)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值