【LeetCode】剑指 Offer 25. 合并两个排序的链表
【LeetCode】剑指 Offer 25. 合并两个排序的链表
文章目录
- 【LeetCode】剑指 Offer 25. 合并两个排序的链表
- 一、递归
- 二、伪头节点
- 总结
一、递归
思路:
- 如果有一个链表为空,返回另一个链表
- 如果 l1 结点小于 l2,下一个结点就是 l1,应该 return l1。在 return 之前,指定 l1 的下一个结点为 l1.next 和 l2 两个链表合并后的头结点
- 如果 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 之后
算法流程:
- 初始化:伪头结点 dum,结点 cur 指向 dum
- 循环合并:当 l1 或 l2 为空时跳出
- 当 l1.val < l2.val 时:cur 的后继节点指定为 l1,并且 l1 向前走一步
- 当 l1.val ≥ l2.val 时:cur 的后继节点指定为 l2,并且 l2 向前走一步
- 结点 cur 向前走一步,即 cur = cur.next
- 合并剩余尾部:跳出时有两种情况,即 l1 为空或 l2 为空
- 若 l1 ≠ null:将 l1 添加至结点 cur 之后
- 否则:将 l2 添加至结点 cur 之后
- 返回值:合并链表在伪头结点 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. 合并两个排序的链表相关推荐
- 《LeetCode力扣练习》剑指 Offer 25. 合并两个排序的链表 Java
<LeetCode力扣练习>剑指 Offer 25. 合并两个排序的链表 Java 一.资源 题目: 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 示例1: ...
- LeetCode Algorithm 剑指 Offer 25. 合并两个排序的链表
剑指 Offer 25. 合并两个排序的链表 Ideas 这题让我想到了归并排序: 划分问题:把序列分成元素个数尽量相等的两半: 递归求解:把两半元素分别排序: 合并问题:把两个有序表合并成一个. 捞 ...
- 剑指offer系列——剑指 Offer 25. 合并两个排序的链表
⭐️前面的话⭐️ 大家好!本篇文章将介绍关于数据结构之链表的OJ题,来自力扣:21. 合并两个有序链表 或 剑指 Offer 25. 合并两个排序的链表 题解,展示代码语言暂时为:Java语言与C语言 ...
- 【最佳解法】剑指 Offer 25. 合并两个排序的链表
立志用最少的代码做最高效的表达 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 示例1: 输入:1->2->4, 1->3->4 输出:1-> ...
- 【算法】剑指 Offer 25. 合并两个排序的链表
文章目录 1.概述 2. 对比 3.递归 1.概述 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 示例1: 输入:1->2->4, 1->3->4 ...
- 剑指offer——25.合并两个排序的链表
题目: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 知识点: -无 注意: 以后写代码前要在开头写出特殊的输入情况 递归认真考虑好输入和输出 代码实现 ...
- 剑指offer 25. 合并两个排序的链表
1.问题描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 2.解决思路 1)非递归的方法 如果可以改变链表,直接从头结点开始依次移动比较两个链 ...
- LeetCode-剑指 Offer 25. 合并两个排序的链表
剑指 Offer 25. 合并两个排序的链表 思路一:双指针法 1.设置dummy为头结点,放置于新链表之前,最后返回的就是dummy.next:设置cur为当前节点,从dummy开始 2.当两个链表 ...
- 剑指Offer:合并两个排序的链表【25】
剑指Offer:合并两个排序的链表[25] 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析 每次都是比较箭头节点,把小节点连接到已经合 ...
最新文章
- flutter实现(OutlineButton)线框按钮
- Java IO流之字符缓冲流
- 高中物理公式、规律汇编表
- tensorboard运行
- 拼接SQL的一个技巧
- [转]聚集索引和非聚集索引(sql server索引结构及其使用)
- 优秀的测试网站(转载)
- flex制作一个用户登录框(含验证码)
- 解决(Missing artifact com.oracle:ojdbc14:jar:11.2.0.4.0)
- SpringBoot(二)
- android 锁屏 定时器,屏幕锁屏 定时器就停了
- 回溯法——旅行商(TSP)问题
- (数据分析)网课评论分析
- OpenStack必备基础知识
- Exporter介绍与指标数据汇总(完结)
- linux脚本除号,Shell脚本编程(上)
- 正确的-配置Tomcat环境变量
- [开发技巧]·TopN指标计算方法
- colorkey口红怎么样_COLORKEY口红怎么样,好不好用?质量如何,耐用吗
- 原创干货 | 史上最全的大数据学习资源(Awesome Big Data)