力扣21.合并两个有序链表
Posted 一个拿着底层薪资操着架构师的心的码农
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣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. 如果两个链表均不为空,根据两链表的表头大小决定下一层的递归参数
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)
根据力扣的测试结果,递归好像比非递归的解法快一些
思路参考:
以上是关于力扣21.合并两个有序链表的主要内容,如果未能解决你的问题,请参考以下文章