力扣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)

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

思路参考:

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

 

以上是关于力扣21.合并两个有序链表的主要内容,如果未能解决你的问题,请参考以下文章

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

精选力扣500题 第7题 LeetCode 21. 合并两个有序链表c++详细题解

合并两个有序链表--力扣

21. 合并两个有序链表-链表-简单

LeetCode21合并两个有序链表

21. 合并两个有序链表