题目描述
解题思路:两个链表进行合并,一个链表的尾结点指向另一个链表的首节点,然后遍历列表进行比较大小,通过交换数字从而达到升序的结果。这里的比较大小,排列顺序可以采用冒泡算法。
解题注意:
链表首先需要判空,如果一个链表为空则直接返回另一个链表即可,都为空则直接结束,返回null。
时间复杂度
冒泡排序
易知时间复杂度为O(n^2),题解的算法为递归 ,其时间复杂度为O(n+m)。所以考虑采取递归的算法。
每次递归则去掉l1或l2的头节点即可
递归代码
递归代码
降低空间复杂度
思路:使用迭代,当 l1 和 l2 都不是空链表时,判断 l1 和 l2 哪一个链表的头节点的值更小,将较小值的节点添加到结果里,当一个节点被添加到结果里之后,将对应链表中的节点向后移一位。
我们设定一个哨兵节点 prehead ,这可以在最后让我们比较容易地返回合并后的链表。我们维护一个 prev 指针,我们需要做的是调整它的 next 指针。然后,我们重复以下过程,直到 l1 或者 l2 指向了 null :如果 l1 当前节点的值小于等于 l2 ,我们就把 l1 当前的节点接在 prev 节点的后面同时将 l1 指针往后移一位。否则,我们对 l2 做同样的操作。不管我们将哪一个元素接在了后面,我们都需要把 prev 向后移一位。
在循环终止的时候, l1 和 l2 至多有一个是非空的。由于输入的两个链表都是有序的,所以不管哪个链表是非空的,它包含的所有元素都比前面已经合并链表中的所有元素都要大。这意味着我们只需要简单地将非空链表接在合并链表的后面,并返回合并链表即可。
迭代算法