链表排序是各大厂面试官经常会问到的一个面试题,这个题目很好的将排序和链表操作结合在一起,有较高的区分度,如果你在面试中被问到了这个问题,你该怎样解决呢?在往下看前先仔细想一想。
简单思路
相信很多同学都对数组排序比较熟悉,冒泡、堆排、快排等等简直手到擒来,但当被问到要用链表来排序时很多同学是一脸懵逼的,表示从来没想过链表还要排序,这才是真正考验你对排序理解深度的时刻,如果你真的彻底理解了排序,那么这个问题简直不要太简单,但仅仅浮于表面含糊其辞的话是通不过后续写代码环节的。
很多同学都能答上来用冒泡和插排来实现,这当然是可以的,但是时间复杂度O(n2),显然这不是面试官想要的答案。
再被进一步问能不能加快排序速度时,有的同学反应过来可以把链表中的值放到数组中,然后就可以用常见的排序方法进行排序了,比如快排;这种方法也可以,这样时间复杂度来到了O(nlogn),但是由于需要额外借助数组,因此空间复杂度是O(n),那么能不能进一步优化呢?
优化思路一:归并排序
实际上是可以的,让我们来思考一下归并排序这种思想,归并排序是说我们把数组分为两半,左边一半排序然后右边一半排序,最后合并两个有序数组,那么这种思路能不能应用在链表排序中呢?实际上也是可以的。
假设我们有一个链表:
首先我们将其分为两半:
这样我就得到了两段链表,然后我们分别对其进行排序,由于每段链表只有两个元素了,因此排序就很简单了,这样我们就得到了两个有序的链表: