题目
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的
思路
递归法
如果链表l1
或者l2
最开始就是空链表,那么就不需要合并操作,只需要返回非空链表即可;
否则需要进行判断l1
和l2
,哪个链表的头节点的值更小,然后递归地决定下一个添加到结果里的节点,如果两个链表有一个为空,则停止递归
java代码如下:
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(-1);//创建虚拟头结点,用于最后返回结果
ListNode prev = dummy;
while (l1 != null && l2 != null) {//不能是l1.next != null,因为后继为空,当前不为空仍然要加入的
if (l1.val <= l2.val) {
prev.next = l1;
l1 = l1.next;
} else {
prev.next = l2;
l2 = l2.next;
}
prev = prev.next;//指针后移,继续判断新的后继节点应该指向谁
}
// 合并后 l1 和 l2 最多只有一个还未被合并完,直接将链表末尾指向未合并完的链表即可
prev.next = (l1 == null) ? l2 : l1;
return dummy.next;//虚拟头结点的作用来了~
}
}
时间复杂度: O(m+n)
空间复杂度: O(1)