LeetCode21 合并两个有序链表

  1. 题目

    java 复制代码
    将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
  2. 示例

    java 复制代码
    输入:l1 = [1,2,4], l2 = [1,3,4]
    输出:[1,1,2,3,4,4]
    示例 2:
    
    输入:l1 = [], l2 = []
    输出:[]
    示例 3:
    
    输入:l1 = [], l2 = [0]
    输出:[0]
  3. 解题思路

    1. 递归。链表list1、list2,比较两个链表的头节点,若list1头结点的值小于list2头结点的值,则以list1为头结点,再对list1剩余节点及list2两个链表合并,将合并结果作为list头结点的next。知道list1和list2都空为止。
    2. 循环(额外空间)。使用两个指针分别遍历两个链表,比较两个量表list1、list2的每一个节点的大小。使用额外空间作为结果链表。将较小的节点添加到新链表。
    3. 循环(链表本身)。与使用循环方式类似,通过一个记录前节点的指针pre进行构造链表。
      1. 两个链表list1、list2,两个指针l1、l2分别指向list1、list2。
      2. 比较l1、l2两个节点大小。
      3. 若l1小,则pre.next为l1节点。此时l1节点已经进入结果链表,则l1指针向后移动。指向l1.next。
      4. 若l2小,则pre.next为l2节点。此时l2节点已经进入结果链表,则l1指针向后移动。指向l2.next。
      5. 比较后,此时结果链表当前节点的pre指针需要向后移动。当前节点为l1或l2.
      6. 循环此过程,知道l1或l2链表为空。
      7. 此时,只剩一个链表没有合并到结果链表中。将剩余链表合并到结果中。
  4. 代码(Java)

    java 复制代码
    class ListNode {
        int val;
        ListNode next;
    
        ListNode() {
        }
    
        ListNode(int val) {
            this.val = val;
        }
    
        ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }
    java 复制代码
    // 方法一
    
    
    class Solution {
        public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
            if (list1 == null) {
                return list2;
            }
            if (list2 == null) {
                return list1;
            }
            if (list1.val < list2.val) {
                list1.next = mergeTwoLists(list1.next, list2);
                return list1;
            } else {
                list2.next = mergeTwoLists(list1, list2.next);
                return list2;
            }
        }
    }
    java 复制代码
    // 方法二
    class Solution {
        public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
            if (list1 == null) {
                return list2;
            }
            if (list2 == null) {
                return list1;
            }
            ListNode p1 = list1;
            ListNode p2 = list2;
            ListNode root = null;
            ListNode temp = null;
            while (p1 != null && p2 != null) {
                if (p1.val <= p2.val) {
                    if (root == null) {
                        root = temp = new ListNode(p1.val, null);
                    } else {
                        temp.next = new ListNode(p1.val, null);
                        temp = temp.next;
                    }
                    p1 = p1.next;
                } else {
                    if (root == null) {
                        root = temp = new ListNode(p2.val, null);
                    } else {
                        temp.next = new ListNode(p2.val, null);
                        temp = temp.next;
                    }
                    p2 = p2.next;
                }
            }
            if (p1 != null) {
                temp.next = p1;
            }
            if (p2 != null) {
                temp.next = p2;
            }
            return root;
        }
    }
    java 复制代码
    // 方法三
    
    class Solution {
        public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
            if (list1 == null) {
                return list2;
            }
            if (list2 == null) {
                return list1;
            }
            ListNode head = new ListNode(-1);
            ListNode pre = head;
            ListNode l1 = list1;
            ListNode l2 = list2;
            while (l1 != null && l2 != null) {
                if (l1.val <= l2.val) {
                    pre.next = l1;
                    l1 = l1.next;
                } else {
                    pre.next = l2;
                    l2 = l2.next;
                }
                pre = pre.next;
            }
            if (l1 != null) {
                pre.next = l1;
            }
            if (l2 != null) {
                pre.next = l2;
            }
            return head.next;
        }
    }
相关推荐
程序员Xu17 分钟前
【OD机试题解法笔记】连续出牌数量
笔记·算法·深度优先
CoovallyAIHub30 分钟前
单目深度估计重大突破:无需标签,精度超越 SOTA!西湖大学团队提出多教师蒸馏新方案
深度学习·算法·计算机视觉
CoovallyAIHub33 分钟前
从FCOS3D到PGD:看深度估计如何快速搭建你的3D检测项目
深度学习·算法·计算机视觉
偷偷的卷1 小时前
【算法笔记 day three】滑动窗口(其他类型)
数据结构·笔记·python·学习·算法·leetcode
北京地铁1号线1 小时前
Zero-Shot(零样本学习),One-Shot(单样本学习),Few-Shot(少样本学习)概述
人工智能·算法·大模型
凤年徐1 小时前
【数据结构】时间复杂度和空间复杂度
c语言·数据结构·c++·笔记·算法
kualcal2 小时前
代码随想录17|二叉树的层序遍历|翻转二叉树|对称二叉树
数据结构·算法
满分观察网友z2 小时前
从混乱到有序:我用“逐层扫描”法优雅搞定公司组织架构图(515. 在每个树行中找最大值)
后端·算法
钮钴禄·爱因斯晨2 小时前
C语言 | 函数核心机制深度解构:从底层架构到工程化实践
c语言·开发语言·数据结构
满分观察网友z2 小时前
一行代码的惊人魔力:从小白到大神,我用递归思想解决了TB级数据难题(3304. 找出第 K 个字符 I)
后端·算法