【每日一题Day286】LC21合并两个有序链表 | 链表模拟 递归

合并两个有序链表【LC21】

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

  • 题解【迭代】

    当list1和list2都不是空链表时,判断list1和list2哪一个链表的头节点的值更小,将较小值的节点添加到结果里,并将对应链表的节点后移一位,另一个链表不动,在下一个循环继续进行比较,则最后list1和list2最多有一个是非空的,并且输入链表为递增链表,所有最后再将剩余非空链表拼接在合并链表的后面,并返回即可。

    java 复制代码
    class Solution {
        public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
            ListNode prehead = new ListNode(-1);
    
            ListNode prev = prehead;
            while (l1 != null && l2 != null) {
                if (l1.val <= l2.val) {
                    prev.next = l1;
                    l1 = l1.next;
                } else {
                    prev.next = l2;
                    l2 = l2.next;
                }
                prev = prev.next;
            }
    
            // 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
            prev.next = l1 == null ? l2 : l1;
    
            return prehead.next;
        }
    }
    
    作者:LeetCode-Solution
    链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/solution/he-bing-liang-ge-you-xu-lian-biao-by-leetcode-solu/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    • 复杂度分析
      • 时间复杂度:O(N+M),其中 N和M分别是链表中的节点数。
      • 空间复杂度:O(1)
  • 题解【递归】

    终止条件:当两个链表都为空时,表示我们对链表已合并完成。

    如何递归:我们判断 l1 和 l2 头结点哪个更小,然后较小结点的 next 指针指向其余结点的合并结果。(调用递归)

    java 复制代码
    class Solution {
        public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
            if (l1 == null) {
                return l2;
            } else if (l2 == null) {
                return l1;
            } else if (l1.val < l2.val) {
                l1.next = mergeTwoLists(l1.next, l2);
                return l1;
            } else {
                l2.next = mergeTwoLists(l1, l2.next);
                return l2;
            }
        }
    }
    
    作者:LeetCode-Solution
    链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/solution/he-bing-liang-ge-you-xu-lian-biao-by-leetcode-solu/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    • 复杂度分析
      • 时间复杂度:O(N+M),其中 N和M分别是链表中的节点数。
      • 空间复杂度:O(N+M)
相关推荐
徐子童41 分钟前
优选算法---链表
数据结构·算法·链表·面试题
CYH&JK43 分钟前
数据结构---链式队列
数据结构
shan&cen1 小时前
Day02 集合 | 30. 串联所有单词的子串、146. LRU 缓存、811. 子域名访问计数
java·数据结构·算法·缓存
阿方.9182 小时前
《树与二叉树详解:概念、结构及应用》
数据结构·二叉树··知识分享
靠近彗星3 小时前
2.2顺序表
数据结构
序属秋秋秋3 小时前
《C++进阶之STL》【哈希表】
数据结构·c++·stl·哈希算法·散列表·哈希表·哈希
睡不醒的kun10 小时前
leetcode算法刷题的第三十二天
数据结构·c++·算法·leetcode·职场和发展·贪心算法·动态规划
_OP_CHEN12 小时前
数据结构(C语言篇):(十二)实现顺序结构二叉树——堆
c语言·数据结构·算法·二叉树·学习笔记··顺序结构二叉树
cellurw14 小时前
EDID 数据结构解析与编辑工具:校验和计算、厂商/设备名编解码、物理地址读写、颜色与时序信息提取
数据结构
Pluchon15 小时前
硅基计划3.0 Map类&Set类
java·开发语言·数据结构·算法·哈希算法·散列表