当前位置: 首页 > news >正文

【算法刷题】合并两个有序链表、获取链表的中间节点、反转链表

合并两个有序链表

题目来源:合并两个有序链表

题目描述

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

解题思路

要合并两个有序链表并返回一个新的升序链表,可以使用迭代的方法。下面是详细的文字描述和相应的Java代码实现:

文字描述

  1. 初始化:首先创建一个虚拟头节点,以便更容易地管理新链表的头部。同时,创建一个指针 current,用于构建新链表。
  2. 遍历两个链表:同时遍历两个链表,比较当前节点的值:
    • 将较小的节点链接到新链表中,并移动对应链表的指针。
    • 将指针 current 移动到新链表的最后一个节点。
  3. 处理剩余节点:若其中一个链表遍历结束,直接将另一个链表的剩余部分链接到新链表的后面。
  4. 返回结果:最后返回合并新链表的头节点,注意从虚拟头节点的下一个节点开始返回。

Java代码

class ListNode {int val;ListNode next;ListNode(int x) { val = x; }
}public class MergeTwoSortedLists {public ListNode mergeTwoLists(ListNode l1, ListNode l2) {// 创建一个虚拟头节点ListNode dummy = new ListNode(0);ListNode current = dummy;// 遍历两个链表while (l1 != null && l2 != null) {if (l1.val < l2.val) {current.next = l1; // 将较小的节点链接到新链表l1 = l1.next;      // 移动l1指针} else {current.next = l2; // 将较小的节点链接到新链表l2 = l2.next;      // 移动l2指针}current = current.next; // 移动current指针}// 处理剩余节点if (l1 != null) {current.next = l1; // 链接l1剩余部分} else {current.next = l2; // 链接l2剩余部分}// 返回新链表的头节点(跳过虚拟头节点)return dummy.next;}
}

总结

以上代码定义了一个 ListNode 类表示链表的节点,并实现了 mergeTwoLists 方法,用于合并两个有序链表。这种方法在时间复杂度上为 O(n),空间复杂度为 O(1),非常高效。

获取链表的中间节点

题目来源:获取链表中间节点

题目描述

给你单链表的头结点 head ,请你找出并返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

解题思路

要找出链表的中间节点,可以使用快慢指针的方法。下面是详细的文字描述和相应的Java代码实现。

文字描述

  1. 初始化两个指针:定义两个指针 slow 和 fast,初始时都指向链表的头节点。slow 每次移动一步,fast 每次移动两步。
  2. 遍历链表
    • 在每一步中,移动 slow 指针一次,fast 指针两次。
    • 当 fast 指针到达链表末尾(即 fast 为 null 或 fast.next 为 null)时,slow 指针就指向链表的中间节点。
  3. 返回结果:返回 slow 指针所指向的节点,即为链表的中间节点。

Java代码

class ListNode {int val;ListNode next;ListNode(int x) { val = x; }
}public class FindMiddleNode {public ListNode middleNode(ListNode head) {ListNode slow = head;ListNode fast = head;// 快慢指针移动while (fast != null && fast.next != null) {slow = slow.next;        // 慢指针每次移动一步fast = fast.next.next;  // 快指针每次移动两步}// 返回慢指针指向的节点,即为中间节点return slow;}
}

总结

以上代码定义了一个 ListNode 类表示链表的节点,并实现了 middleNode 方法,用于找出链表的中间节点。该方法的时间复杂度为 O(n),空间复杂度为 O(1),在效率上非常优越。这种方法确保即使链表的长度为偶数,也能返回第二个中间节点。

反转链表

题目来源:反转链表

题目描述

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

解题思路

要反转单链表,可以使用迭代的方法。下面是详细的文字描述和相应的Java代码实现。

文字描述

  1. 初始化三个指针

    • prev:用来存储当前节点的前一个节点,初始时设为 null
    • current:用来遍历链表,初始时设为头节点 head
    • next:用来暂存当前节点的下一个节点,防止反转链接后丢失后续节点。
  2. 遍历链表:使用一个 while 循环遍历链表,直到 current 为 null

    • 在每次循环中,首先将 next 指向 current.next,以暂存当前节点的下一个节点。
    • 然后,将 current.next 指向 prev,实现反转链接。
    • 接着,移动 prev 和 current,分别指向当前节点和下一个节点(即 next)。
  3. 返回结果:循环结束后,prev 指向反转后的链表头节点,将其返回。

Java代码

class ListNode {int val;ListNode next;ListNode(int x) { val = x; }
}public class ReverseLinkedList {public ListNode reverseList(ListNode head) {ListNode prev = null; // 前一个节点ListNode current = head; // 当前节点ListNode next; // 下一个节点while (current != null) {next = current.next; // 暂存下一个节点current.next = prev; // 反转当前节点的指向prev = current; // 移动前一个节点到当前节点current = next; // 移动当前节点到下一个节点}// prev 现在指向反转后的头节点return prev;}
}

总结

以上代码定义了一个 ListNode 类表示链表的节点,并实现了 reverseList 方法,用于反转链表。该方法的时间复杂度为 O(n),空间复杂度为 O(1),非常高效。这种方法通过指针的重新链接,实现了链表的反转。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【面试经验】24届前端校招 字节、阿里、美团、快手、腾讯面试经验汇总
  • 【扒代码】图像数据 Transformer
  • Eclipse插件之Java Dependency Viewer(显示类和包的关系图)
  • 日志Log程序(C++)
  • 深度学习每周学习总结N6:使用Word2vec实现文本分类
  • Spring Cloud全解析:注册中心之zookeeper注册中心
  • 4.MySQL数据类型
  • 2023华为od机试C卷【围棋的气】python实现
  • 哈萨克语驾考学习软件求推荐?
  • Springboot项目基础开发模式+注解
  • 【香橙派系列教程】(十三) 香橙派的摄像头接入
  • 【Pyspark-驯化】一文搞懂Pyspark修改hive表描述以及增加列使用技巧
  • 简单的射箭小游戏网页源码
  • 表字段显示tip
  • 【数据结构题目】循环队列,以及队列实现栈的模拟
  • 【Linux系统编程】快速查找errno错误码信息
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Java超时控制的实现
  • PHP 小技巧
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 从重复到重用
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 分类模型——Logistics Regression
  • 来,膜拜下android roadmap,强大的执行力
  • 判断客户端类型,Android,iOS,PC
  • 前端设计模式
  • 使用 @font-face
  • 【干货分享】dos命令大全
  • const的用法,特别是用在函数前面与后面的区别
  • # 飞书APP集成平台-数字化落地
  • #QT(智能家居界面-界面切换)
  • #考研#计算机文化知识1(局域网及网络互联)
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (35)远程识别(又称无人机识别)(二)
  • (Charles)如何抓取手机http的报文
  • (SpringBoot)第七章:SpringBoot日志文件
  • (层次遍历)104. 二叉树的最大深度
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)一些感悟
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .java 9 找不到符号_java找不到符号
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET 8 跨平台高性能边缘采集网关
  • .net framework 4.0中如何 输出 form 的name属性。
  • .Net IE10 _doPostBack 未定义
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .net(C#)中String.Format如何使用
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .net反混淆脱壳工具de4dot的使用
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • .NET中winform传递参数至Url并获得返回值或文件
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • .stream().map与.stream().flatMap的使用