合并两个有序链表(递归)
题目描述
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
先看一下代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1==null) return l2 ;
if (l2==null) return l1 ;
if (l1.val<l2.val) {
l1.next = mergeTwoLists(l1.next,l2) ;
return l1 ;
}else {
l2.next = mergeTwoLists(l1,l2.next) ;
return l2 ;
}
}
}
分析
这个算法,来自大名鼎鼎的归并排序,你一下子看不懂很正常,你可以这么来理解,两个链表之间通过比大小玩连连看,在链表一或链表二最后的结点,开始往回走,把之前比较的结点按序连成一条线,最终返回的就是一个合并好的链表
如果还是理解不了,你可以以一个极端的例子,去代入这段代码,帮助你理解
(1,2,3)
(4,5,6)
性能分析
时空复杂度皆为O(m+n)
两个链表的结点总和,在这道题中,不一定每个结点都会被访问到,如上面举例的极端情况,所以实际时空复杂度应该是小于O(m+n)
==========update by 2020 4/16 ========
可运行代码
#include