逆转交替合并两个链表的解析与实现
作者:贤狼罗兰斯 发布时间:2021-12-31 12:37:41
逆转交替合并两个链表,即从一个链表的尾指针指向另一个链表的尾指针,依次逆转交替进行合并。下面就通过实例来详细的介绍该逆转交替合并两个链表的思路与实现代码。
一、问题描述
链表A和B
A: 1->2->3->4
B: a->b->c->d
请逆转交替合并两个链表,示例结果如下:
4->d->3->c->2->b->1->a
节点类型定义如下:
classNode {
public Node next;
...
}
二、源代码:
传入两个A和B链表,返回处理后的链表:
Node reverse_merge(Node A, Node B)
{
//A、B都只有一个节点
if(A.next==null)
{
A.next=B;
return A;
}
//A、B都大于等于2个节点
Node nextA;
Node nextB;
nextB = B.next;
B.next = null;
nextA = A.next;
A.next = B;
B = nextB;
while (nextA.next != null)
{
B.next = A;
A = nextA;
nextA = A.next;
A.next = B;
B = nextB;
}
nextB.next = A;
nextA.next = B;
return nextA;
}
三、解析:
程序分成三个部分——while循环之前、while循环体、while循环之后。
1)处理之前的链表A和B
2)while循环——核心的处理部分
这里处理程序的可重复的部分,我们的目标是红色的部分,要达成红色的链接模式,有两个原子结构:深红色圆圈1和蓝色圆圈2
但是1中需要特别处理a所在的节点,仅对于a所在的节点需要一个next=null的操作,也就是说1中的第一个原子要放在循环之外实现,这包括1指向a,b指向1的操作。
换种方式,如果使用2方式,就只需要将1指向a放在循环之外。所以,这里采用了2中描述的原子结构。
原子结构需要的信息
当我们进行到某一次循环时,假设进行到蓝色圆圈的操作了,这时候我们链表的状态为:
更为直观的画法为:
它涉及到3个节点——2,3和c。其中红色部分是我们希望做到的链接方式。为了链接c->2,3->c,必须知道有相应的指针记录他们的位置。所以在循环之前我们需要掌握这三个元素的地址,并且在处理完之后,用相同的方式表示下一次需要处理的原子结构。
例如以下这种方式记录这次循环中设计的3个节点的地址:
A、nA、B代表指向相应节点的指针或者说是引用。
在处理完成之后需要用相同的方式记录下一次原子结构涉及的节点,这样才能保证循环能够按统一逻辑执行下去,我们的目标是:
这些赋值操作正是循环体的中代码所做的事情,恰好代码也是按照上面指定的命名形式,有一点区别,图中的nA代表代码中的nextA。除此之外,代码中定义了nextB作为一个中间变量,用来记录c->d断开之前d节点的地址,因为c指向2之后就会失去对d的联系,这个中间变量是必须的。
3)while循环之前——解决预备操作所带来的问题
我们还没有处理a节点,因为它太特殊了,没有合适的原子结构能包括它。所以我们把它放在循环体之外,并且为循环做好准备工作,我们希望的结果是这样:
在这之后我们就可以把1,2,b放在循环体中处理。这里也考虑了A、B都只有一个节点的情况,也需要单独处理。
4)while循环之后——最后的处理
当我们发现B链表到达末尾时,结束循环。但这时候并有处理末尾节点,换句话说,末尾节点不在原子结构中。我们的循环会停止在这个原子结构中:
作为最后的操作,我们需要手动处理d->3,4->d的链接步骤——这也是没有办法的,因为原子结构的处理必须找到能够把所有指针传递下去的节点,作为最后的节点是没办法吧指针继续传递下去。
这不是一个完整的方法,还有很多事情没有处理,比如输入的A、B如果不等长,应该如何处理。另外Node数据结构并没有完整的定义,不过这都不是本文讨论的重点。
通过以上详细的解析,希望能够帮助大家很好的理解该逆转交替合并两个链表的方法与实现。


猜你喜欢
- 各个框架版本信息springboot: 2.1.3springcloud: Greenwich.RELEASEseata: 1.0.0sha
- SQLite 介绍SQLite,是一款轻型的数据库,用于本地的数据储存。先说说优点,它占用资源非常的低,在嵌入式设备中需要几百K的内存就够了
- 一条SQL使用两个foreach的问题未修改前的 SQL 语句<select id="findQuestionType_3_
- 如何将Object类型转换为int类型Object object = null;try{ Integer.pars
- 一、问题描述换了一台电脑,重新进行idea安装配置。然后打开原来的项目结果引入spring-boot-maven-plugin出现爆红,而且
- 本文实例讲述了C#基于UDP进行异步通信的方法。分享给大家供大家参考。具体如下:服务器端:using System;using System
- 返回集合为null还是空集合及空集合的三种写法个人认为在自己写接口时,需要返回集合时返回一个空集合,比如mybatis查询如果返回一个集合,
- 添加maven依赖<?xml version="1.0" encoding="UTF-8"?&
- 在我们开发过程中用 Mybatis 经常会用到下面的例子Mapper如下Map<String ,String > testArr
- 如果是在资源文件里,可以这样写.< resources > <
- 一、项目简述功能: 一套完整的网上花店商场系统,系统支持前台会员的注册 登陆系统留言,花朵的品种选择,详情浏览,加入购物 车,购买花朵等;后
- 实践过程效果代码public partial class frmSend : Form{ public frmSe
- 背景在Spring boot项目开发中经常遇到需要使用枚举的场景,比如描述状态、性别、类型等相关字段。通常这些字段在数据库会以tinyint
- 话不多说,请看代码:using System;using System.Web;using System.Drawing;using Sys
- 程序生成的自定义文件,比如后缀是.test这种文件怎么直接启动打开程序,并打开本文件呢 1、
- Java反射动态修改注解的某个属性值昨晚看到一条问题,大意是楼主希望可以动态得建立多个Spring 的定时任务。这个题目我并不是很熟悉,不过
- future机制是在通过线程去执行某个任务的时候,如果比较耗时,我们可以通过futureTask机制,异步返回,继续去执行其他的任务,在需要
- 1.全面屏的适配全面屏出现后,如果不做适配,屏幕上会出现上下黑边,影响视觉效果。针对此问题,Android官方提供了适配方案,即提高App所
- ActiveMQ 结合 Spring 收发消息直接使用 ActiveMQ 的方式需要重复写很多代码,且不利于管理,Spring 提供了一种更
- 在 Java 中,当我们处理String时,有时需要将字符串编码为特定字符集。编码是一种将数据从一种格式转换为另一种格式的方法。字符串对象使