两个升序链表合并成一个降序链表的时间复杂度

7 篇文章 1 订阅
7 篇文章 0 订阅

王道考研P7 第六题
【2013年统考真题】已知两个长度分别为m和n的升序链表,若将它们合并为长度为m+n的一个降序链表,则最坏情况下的时间复杂度是()
A. O(n)
B. O(mn)
C. O(min(m,n))
D. O(max(m,n))

答案是D

注意,此题中的时间复杂度并不是指移动的次数,因为你无论如何怎么移动,移动的次数都是m+n,这里指的是链表中元素的比较次数。

比较的最好情况是一个链表n比另一个链表m短,并且链表n的最大元素比链表m的最小元素小,所以比较的时间复杂度是O(min(n,m))

为什么是O(min(n,m))??
如下图所示
在这里插入图片描述
比较抽象,介意勿怪

很显然,只要把链表n的三个元素分别去跟链表m的第一个元素即4去比较,比较完后再把m链表插在后面。比较的次数就是n的的长度。

下面我们再来看看比较的最坏情况

如下图所示
在这里插入图片描述
双指针比较的话,步骤如下
指针分别指向n[1]和m[1]
①1和2比较,1小,出去了,n指针指向3,m指针还是指向2
②2和3比较,2小,出去了,n指针指向3,m指针指向4
③3和4比较,3小,出去了,n指针指向5,m指针指向4
④4和5比较,4小,出去了,n指针指向5,m指针指向6
⑤5和6比较,5小,出去了,n指针指向7,m指针指向6
⑥6和7比较,6小,出去了,n指针指向7,m指针指向8
⑦7和8比较,7小,出去了,n链表结束,8插在7后面

所以一共比较了m+n-1

在最坏情况下,不管n和m是多长,只要相互交错的情况下,比较的次数就是m+n-1

例如下面的情况也是m+n-1
在这里插入图片描述
n链表中5比较了三次,8比较了三次,10比较了三次,13比较了三次,一共是4+6-1=9次

但是,答案中并没有O(n+m-1)或O(n+m)这个选项
注:当n和m无限大的时候,-1忽略掉

这里就需要提醒的是,时间复杂度是一个级数概念,即O(2n),O(n+1000),,O(n-50),都是属于O(n)这个级别(范畴)
并且是一个
线性变化的常数项级
,同理O(m)也一样

包括取大去小原则
如果一个算法的时间复杂度是n3+n2+n+1
那么算法复杂度是O(n3)

回到题目,如果我们以链表m长度远大于链表n的情况下来看,那么在相互比较的情况下,O(m+n)是否可以看成O(m)?同理,如果我们以链表n长度远大于链表m的情况下来看,O(m+n)是否可以看成O(n)?

那么结论就是:O(m+n)==O(max(m,n))

当然也可以用夹逼定理去说明这个结论
O(max(m,n))≤O(m+n)≤2O(max(m,n))
2O(max(m,n))还是属于O(max(m,n))这个级别
所以可证:O(m+n)==O(max(m,n))

所以答案就是D

本篇博客有参考本题类似的解答(一开始我也对这题的答案感到不解,去百度搜了下,最后总结),研友在参考解答的时候也可以提出自己的疑问!

  • 110
    点赞
  • 170
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 33
    评论
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端小王hs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值