力扣21.合并两个有序链表
21. 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4
非递归(迭代):
简单的归并
1 class Solution { 2 // 简单的归并 3 public ListNode mergeTwoLists(ListNode l1, ListNode l2) { 4 ListNode head = new ListNode(); // 创建一个头结点,方便后面的遍历过程 5 ListNode p = head; 6 // 判断l1和l2的表头结点,链接小的,后移 7 while(l1 != null && l2 != null){ 8 if(l1.val <= l2.val){ 9 p.next = l1; 10 l1 = l1.next; 11 }else{ 12 p.next = l2; 13 l2 = l2.next; 14 } 15 p = p.next; 16 } 17 // 链接多余的部分 18 p.next = (l1 != null) ? l1 : l2; 19 return head.next; 20 } 21 }
力扣测试时间为1ms, 空间为39.4MB
复杂度分析:
时间复杂度:最坏情况下需要遍历所有结点(即交叉连接两链表结点时),时间复杂度为O(n+m)
空间复杂度:O(1)
递归写法
1. 先判断某个链表是否为空,如果为空直接返回另一个链表
2.如果两个链表均不为空,根据两链表的表头大小决定下一层的递归参数。因为 mergeTwoLists(list1, list2)函数会返回 list1 和 list2 两个链表合并后的结果,所以如果 l1.val < l2.val, 把 l1.next 和 l2 两个链表的合并后的结果赋值给 l1.next, 这样就完成了2个链表的合并,l1.val > l2.val同理。
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; } } }
力扣测试时间为:0ms, 空间为39MB
复杂度分析:
时间复杂度:最坏情况下要遍历所有结点,时间复杂度为O(n+m)
空间复杂度:同样是在最坏情况下,递归深度最大可达(n+m)层,所以空间复杂度为O(n+m)
根据力扣的测试结果,递归好像比非递归的解法快一些
思路参考:

浙公网安备 33010602011771号