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

21. 合并两个有序链表

题目链接:

解题思路:

  1. 遍历,双指针:因为两个链表有序,所以只需要依次比较两个元素的大小,然后添加到新的链表中即可

  1. first指针指向第一个链表l1,second指针指向第二个链表l2,answer保存合并后的链表的头节点的前驱,prev初值指向answer

  1. 如果fist和second当前指向的节点都不为null,循环遍历:

  1. 如果first.val<second.value,prev.next=first,first=first.next,prev=prev.next

  1. 否则,prev.next=second,second=second.next,prev=prev.next

  1. 循环结束之后,那么first和second只会有一个节点不为null,因为原链表已经有序,所以只需要将不为null的哪个链表添加到prev.next中即可

  1. 最终answer.next即所求

AC代码:

class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode first = list1;ListNode second = list2;ListNode head = new ListNode();ListNode tem = head;while (first != null && second != null) {if (first.val < second.val) {tem.next = new ListNode(first.val);first = first.next;tem = tem.next;} else {tem.next = new ListNode(second.val);second = second.next;tem = tem.next;}}tem.next = first != null ? first : second;return head.next;}
}
  1. 递归解法

  1. 对于递归解法,首先需要定义递归函数的功能,然后定义递归的终止条件

  1. 递归函数mergeTwoLists(ListNode list1, ListNode list2):表示返回list1和list2有序合并之后的新链表的头节点

  1. 递归的终止条件:

  1. 如果其中任何一个链表为null,那么直接返回剩余的一个链表就可以了

  1. 否则:进行递归求解

  1. 如果list1.val<list2.val,这个时候list1就是合并后有序链表的头节点。也就是说递归函数返回的结果应该为list1,但是list1后面的节点和list2还没有合并,所以还不能直接返回list1,返回之前需要保证list1.next的值是list1后面的节点和list2合并之后的有序链表的头节点,这样list1才是满足结果的链表的头节点,查看递归函数的定义,经过mergeTwoLists(list.next,list2)后,list.next和list2也已经有序合并,并且递归函数的返回值就是list.next和list2有序合并后新链表的头节点,因此list1.next=mergeTwoLists(list.next,list2),然后return list1

  1. 否则,合并后有序链表的头节点为list2,list2.next的值就是list1和list2.next合并后有序链表的头节点,因此list2.next=mergeTwoLists(list, list2.next),然后return list2

AC代码

class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {if (list1==null){return list2;}else if (list2==null){return list1;}else {if (list1.val< list2.val){list1.next=mergeTwoLists(list1.next,list2);return list1;}else {list2.next=mergeTwoLists(list1,list2.next);return list2;}}}
}
http://www.lryc.cn/news/11036.html

相关文章:

  • 产品经理知识体系:5.如何做好产品数据分析?
  • 详解垃圾回收算法,优缺点是什么?|金三银四系列
  • Android 虚拟 A/B 详解(七) SnapshotManager 之标识文件
  • LA@生成子空间@范数@衡量矩阵大小@正交化
  • MT2012_竹鼠的白色季节
  • MySQL是什么?它有什么优势?
  • 基础篇—CSS padding(填充\内边距)解析
  • 二进制枚举
  • 2|数据挖掘|聚类分析|k-means/k-均值算法
  • 使用和制作动、静态库
  • 【Java基础】023 -- 集合进阶(List、Set、泛型、树)
  • 面试题整理01-集合详解
  • 数据驱动的两阶段分布鲁棒(1-范数和∞-范数约束)的电热综合能源系统研究(Matlab代码实现)
  • ArcGIS网络分析之发布网络分析服务(二)
  • js实现元素样式切换的基本功能
  • java 策略模式 + 工厂模式 实例
  • 本地生成动漫风格 AI 绘画 图像|Stable Diffusion WebUI 的安装和部署教程
  • 华为OD机试 - 异常的打卡记录 | 备考思路,刷题要点,答疑 【新解法】
  • 「机器学习笔记」之深度学习基础概念(基于Pytorch)
  • 概率和似然
  • 前期软件项目评估偏差,如何有效处理?
  • Xline v0.2.0: 一个用于元数据管理的分布式KV存储
  • CompletableFuture
  • 面试不到10分钟就被赶出来了,问的实在是太变态了...
  • 【C++】类与对象 (四)初始化列表 static成员 友元 内部类 匿名对象 拷贝对象时的一些编译器优化
  • 04:进阶篇 - 编译 CTK
  • SQL73 返回所有价格在 3美元到 6美元之间的产品的名称和价格
  • 【Linux 多线程互斥】如何保证锁的原子性(互斥的原理)
  • Android 实现沉浸式全屏
  • 数据分析与SAS学习笔记6