现在正是春招的时候,我这个准毕业生也参加了各大公司的招聘活动,前段时间过了一家的线上笔试,有幸去到面试现场和面试官直接交流,结果虽然不尽如人意,可也算是为了今年春招作下准备工作。当时,面试官让我现场写一道编程题,题目是:现有两个已排序单链表,请设计算法将两个链表合并为一个已排序单链表。初看我觉得很简单,虽然数据结构已经有段时间没看了,可这种“基础题”也不至于完全不会啊!面试官让我先整理思路,想好了先和他说一遍解题思路再写代码,开始我向他确定了几个我认为比较有用的信息——单链表是否带头结点、二升序还是降序,得到的答案是——无头结点、升序降序都行。可是,在他给我的时间里,我整个大脑像是停止运转了一样,思绪非常的混乱,等到最后面试官都看不下去了,直接和我挑明“写不出代码也没关系,说一遍思路也行”,这句话对于当时的我来说就像一根救命稻草,我连忙接下这话,把还没有真正理顺的思路就这样讲了出来...现在想想,当时真的好怂啊,一直担心时间不够,最应该关心的题目反而都没静下心来好好解决。
后来,我在《剑指offer》里面遇见了这道题,现在就好好讲讲这个问题吧~
在这之前,我们先看一下“合并两个有序数组”这个问题。因为数组是一组连续存储的单元组成的,如果在合并时,只考虑在原来数组的基础上进行合并,并且紧接着数组之后的空间可用、充足的话,那么我们的合并方法就如下图所示:
上图是完整的合并过程,其中要注意两点: 1. 已排序新数组的长度一定要小于等于原数组的长度 2.拷贝顺序为从后往前,如采用从前往后的方式,则整个合并过程的时间复杂度为O(n∧2),并且可能发生内存重叠。
合并两个单链表不像合并两个数组一样操作简单,因为链表的各