【LeetCode】剑指 Offer 25. 合并两个排序的链表

文章目录

  • 【LeetCode】剑指 Offer 25. 合并两个排序的链表
  • 一、递归
  • 二、伪头节点
  • 总结

一、递归

思路:

  1. 如果有一个链表为空,返回另一个链表
  2. 如果 l1 结点小于 l2,下一个结点就是 l1,应该 return l1。在 return 之前,指定 l1 的下一个结点为 l1.next 和 l2 两个链表合并后的头结点
  3. 如果 l1 结点大于 l2,下一个结点就是 l2,应该 return l2。在 return 之前,指定 l2 的下一个结点为 l1 和 l2.next 两个链表合并后的头结点
/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) { val = x; }* }*/
class Solution {public ListNode mergeTwoLists(ListNode l1, ListNode l2) {if(l1 == null || l2 == null)return l1 == null ? l2 : l1;if(l1.val <= l2.val){l1.next = mergeTwoLists(l1.next,l2);return l1;}else{l2.next = mergeTwoLists(l1,l2.next);return l2;}}
}
  • 时间复杂度:O(m+n),m 和 n 分别为两链表长度
  • 空间复杂度:O(m+n)

二、伪头节点

根据题目描述,链表 l1,l2 是递增的,因此容易想到使用双指针 l1 和 l2 遍历两链表,根据 l1.val 和 l2.val 的大小关系确定结点添加顺序,两结点指针交替前进,直至遍历完毕

引入伪头结点:由于初始状态合并链表中无结点,因此循环第一轮时无法将结点添加到合并链表中。解决方案:初始化一个辅助结点 dum 作为合并链表的伪头结点,将各结点添加至 dum 之后

算法流程:

  1. 初始化:伪头结点 dum,结点 cur 指向 dum
  2. 循环合并:当 l1 或 l2 为空时跳出
    1. 当 l1.val < l2.val 时:cur 的后继节点指定为 l1,并且 l1 向前走一步
    2. 当 l1.val ≥ l2.val 时:cur 的后继节点指定为 l2,并且 l2 向前走一步
    3. 结点 cur 向前走一步,即 cur = cur.next
  3. 合并剩余尾部:跳出时有两种情况,即 l1 为空或 l2 为空
    1. 若 l1 ≠ null:将 l1 添加至结点 cur 之后
    2. 否则:将 l2 添加至结点 cur 之后
  4. 返回值:合并链表在伪头结点 dum 之后,因此返回 dum.next 即可
/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) { val = x; }* }*/
class Solution{public ListNode mergeTwoLists(ListNode l1, ListNode l2){ListNode dum = new ListNode(0);ListNode cur = dum;while(l1 != null && l2 != null){if(l1.val < l2.val){cur.next = l1;l1 = l1.next;}else{cur.next = l2;l2 = l2.next;}}if(l1 == null || l2 == null)l1 == null ? cur.next = l2 : cur.next = l1;return cur.next;}
}
  • 时间复杂度 O(m + n)
  • 空间复杂度 O(1):结点引用 dum,cur 使用常数大小的额外空间

总结

一开始没有想到使用伪头结点,而是借助辅助结点将 l2 中的结点插入到 l1,通过了测试代码,但是提交失败。因为当 l2 中的结点小于 l1 的头结点,那么就不能直接返回 l1 了,需要加很多判断,就很繁琐。伪头结点是很容易理解的,但递归我是一点思路都没有,递归 yyds

【LeetCode】剑指 Offer 25. 合并两个排序的链表相关推荐

  1. 《LeetCode力扣练习》剑指 Offer 25. 合并两个排序的链表 Java

    <LeetCode力扣练习>剑指 Offer 25. 合并两个排序的链表 Java 一.资源 题目: 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 示例1: ...

  2. LeetCode Algorithm 剑指 Offer 25. 合并两个排序的链表

    剑指 Offer 25. 合并两个排序的链表 Ideas 这题让我想到了归并排序: 划分问题:把序列分成元素个数尽量相等的两半: 递归求解:把两半元素分别排序: 合并问题:把两个有序表合并成一个. 捞 ...

  3. 剑指offer系列——剑指 Offer 25. 合并两个排序的链表

    ⭐️前面的话⭐️ 大家好!本篇文章将介绍关于数据结构之链表的OJ题,来自力扣:21. 合并两个有序链表 或 剑指 Offer 25. 合并两个排序的链表 题解,展示代码语言暂时为:Java语言与C语言 ...

  4. 【最佳解法】剑指 Offer 25. 合并两个排序的链表

    立志用最少的代码做最高效的表达 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 示例1: 输入:1->2->4, 1->3->4 输出:1-> ...

  5. 【算法】剑指 Offer 25. 合并两个排序的链表

    文章目录 1.概述 2. 对比 3.递归 1.概述 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 示例1: 输入:1->2->4, 1->3->4 ...

  6. 剑指offer——25.合并两个排序的链表

    题目: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 知识点: -无 注意: 以后写代码前要在开头写出特殊的输入情况 递归认真考虑好输入和输出 代码实现 ...

  7. 剑指offer 25. 合并两个排序的链表

    1.问题描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 2.解决思路 1)非递归的方法     如果可以改变链表,直接从头结点开始依次移动比较两个链 ...

  8. LeetCode-剑指 Offer 25. 合并两个排序的链表

    剑指 Offer 25. 合并两个排序的链表 思路一:双指针法 1.设置dummy为头结点,放置于新链表之前,最后返回的就是dummy.next:设置cur为当前节点,从dummy开始 2.当两个链表 ...

  9. 剑指Offer:合并两个排序的链表【25】

    剑指Offer:合并两个排序的链表[25] 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析 每次都是比较箭头节点,把小节点连接到已经合 ...

最新文章

  1. flutter实现(OutlineButton)线框按钮
  2. Java IO流之字符缓冲流
  3. 高中物理公式、规律汇编表
  4. tensorboard运行
  5. 拼接SQL的一个技巧
  6. [转]聚集索引和非聚集索引(sql server索引结构及其使用)
  7. 优秀的测试网站(转载)
  8. flex制作一个用户登录框(含验证码)
  9. 解决(Missing artifact com.oracle:ojdbc14:jar:11.2.0.4.0)
  10. SpringBoot(二)
  11. android 锁屏 定时器,屏幕锁屏 定时器就停了
  12. 回溯法——旅行商(TSP)问题
  13. (数据分析)网课评论分析
  14. OpenStack必备基础知识
  15. Exporter介绍与指标数据汇总(完结)
  16. linux脚本除号,Shell脚本编程(上)
  17. 正确的-配置Tomcat环境变量
  18. [开发技巧]·TopN指标计算方法
  19. colorkey口红怎么样_COLORKEY口红怎么样,好不好用?质量如何,耐用吗
  20. 原创干货 | 史上最全的大数据学习资源(Awesome Big Data)

热门文章

  1. 利用oc门或od门实现线与_福师《数字逻辑》在线作业二答案
  2. zookeeper删除节点的权限_zookeeper权限管理
  3. jenkins 用户授权
  4. 【转】TCP/IP协议——ARP详解
  5. notify vs nofifyall
  6. 管理Shader——Shader概览
  7. PHP远程文件管理,可以给表格排序,遍历目录,时间排序
  8. access中case替代方法
  9. java 文件压缩_java实现文件压缩
  10. java 标识符_java标识符是什么