两个未排序的单个链表到一个已排序的单个链表

时间:2012-09-05 17:11:50

标签: performance algorithm sorting data-structures time-complexity

给出两个大小为MN的未分类的单个链接列表。任务是创建单个已排序的链接列表。不应创建新节点。 我想到了两种方法。

方法1:

在MlogM和NlogN中单独对每个列表进行排序。然后合并两个排序列表 时间复杂度:O(MlogM + NlogN)

方法2:

将第二个列表附加到第一个列表的末尾。然后对列表进行排序 时间复杂度:O((M + N)log(M + N))

哪种方法更好?
还有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

渐渐地说 - 它是一样的。

如果n<m则:

O(nlogn+ mlogm) = O(mlogm)
and 
O(n+m)log(n+m)) = O(nlog(n+m) + mlog(n+m)) = O(nlog(m) + mlog(m)) = O(mlogm)

对称,如果m<n两者都是O(nlogn)

事实上,对于n=m,方法1是merge sort

的第一步

答案 1 :(得分:0)

无论如何,approch 1是好的。如果

,请参阅此计算
  • n = 2且m = 3 nlogn = 0.60,mlogm = 1.43,nlogn + mlogm = 2.03而 (n + m)log(n + m)= 3.49

  • n = 2且m = 30 nlogn = 0.60,mlogm = 44.31,nlogn + mlogm = 44.91 (n + m)log(n + m)= 48.16

  • n = 2且m = 300 nlogn = 0.60,mlogm = 743.14,nlogn + mlogm = 743.74
    而(n + m)log(n + m)= 748.96

  • n = 2且m = 3000 nlogn = 0.60,mlogm = 10,431.36,nlogn + mlogm =
    10,431.96而(n + m)log(n + m)= 10,439.18

  • n = 2且m = 30000 nlogn = 0.60,mlogm = 134,313.64,nlogn + mlogm =
    134,314.24而(n + m)log(n + m)= 134,323.46

  • n = 2且m = 300000 nlogn = 0.60,mlogm = 1,643,136.38,nlogn + mlogm = 1,643,136.98而(n + m)log(n + m)= 1,643,148.19

因为,这背后的明显原因是:无论如何,

(n+m) > n & (n+m) > m
log (n+m) >= log n
log (n+m) >= log m

在n = m的情况下,

nlogn + mlogm = 2m logm
              = log m (power of 2m)
(n+m) log(n+m) = 2m log (2m)
               = log 2m (power of 2m)
and m(power of 2m) < 2m(power of 2m)

选择第一个approch的唯一简单原因是,与大型数组相比,排序一小部分数据的时间更短。