码迷,mamicode.com
首页 > 其他好文 > 详细

力扣21.合并两个有序链表

时间:2020-06-14 20:42:02      阅读:61      评论:0      收藏:0      [点我收藏+]

标签:写法   strong   class   ==   targe   merge   return   有序链表   递归   

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)

根据力扣的测试结果,递归好像比非递归的解法快一些

思路参考:

https://leetcode-cn.com/problems/merge-two-sorted-lists/solution/he-bing-liang-ge-you-xu-lian-biao-by-leetcode-solu/

 

力扣21.合并两个有序链表

标签:写法   strong   class   ==   targe   merge   return   有序链表   递归   

原文地址:https://www.cnblogs.com/hi3254014978/p/13126519.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!