将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
法一:迭代
(1) 取出两个链表值比较小的头节点,然后递归取出两个链表中值比较小的节点拼接。
(2) 直至两个链表中所有节点都拼接完成返回值比较小的头节点。
时间复杂度:O(n+m) ,其中 n 和 m 分别为两个链表的长度。因为每次循环迭代中,l1 和 l2 只有一个元素会被放进合并链表中, 因此 while 循环的次数不会超过两个链表的长度之和。所有其他操作的时间复杂度都是常数级别的,因此总的时间复杂度为 O(n+m)。
空间复杂度:O(1)。我们只需要常数的空间存放若干变量。
/*** 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) {ListNode pre = new ListNode(0);ListNode head = pre;while (l1 != null && l2 != null) {if (l1.val < l2.val) {pre.next = l1;l1 = l1.next;} else {pre.next = l2;l2 = l2.next;}pre = pre.next;}if (l1 == null) pre.next = l2;if (l2 == null) pre.next = l1;return head.next;}}

法二:递归
终止条件:两条链表分别名为 l1 和 l2,当 l1 为空或 l2 为空时结束
返回值:每一层调用都返回排序好的链表头
本级递归内容:如果 l1 的 val 值更小,则将 l1.next 与排序好的链表头相接,l2 同理
时间空间复杂度:O(m+n),m为 l1的长度,n 为 l2 的长度
/*** 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 (l2 == null) return l1;if (l1 == null) return l2;if (l1.val < l2.val) {l1.next = mergeTwoLists(l1.next, l2);return l1;} else {l2.next = mergeTwoLists(l1, l2.next);return l2;}}}

