逆转交替合并两个链表的解析与实现

 更新时间:2015年07月21日 11:19:01   作者:贤狼罗兰斯  
本篇文章主要介绍了将两个链表逆转交替合并的实现思路与方法,需要的朋友可以参考下

逆转交替合并两个链表,即从一个链表的尾指针指向另一个链表的尾指针,依次逆转交替进行合并。下面就通过实例来详细的介绍该逆转交替合并两个链表的思路与实现代码。

一、问题描述

链表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数据结构并没有完整的定义,不过这都不是本文讨论的重点。

通过以上详细的解析,希望能够帮助大家很好的理解该逆转交替合并两个链表的方法与实现。

相关文章

  • 详解Java 中的嵌套类与内部类

    详解Java 中的嵌套类与内部类

    这篇文章主要介绍了详解Java 中的嵌套类与内部类的相关资料,希望通过本文大家能掌握Java 嵌套类与内部类的使用方法,需要的朋友可以参考下
    2017-09-09
  • SpringBoot使用MyBatis实现数据的CRUD

    SpringBoot使用MyBatis实现数据的CRUD

    MyBatis是一个轻量级的对象关系映射(Object-Relational Mapping,ORM)框架,它允许开发者通过编写SQL动态查询数据库,而无需显式地操作JDBC,对于增删改查操作,MyBatis提供了一种基于XML或注解的方式来进行,本文介绍了SpringBoot使用MyBatis实现数据的CRUD
    2024-11-11
  • Spring Boot如何优化内嵌的Tomcat示例详解

    Spring Boot如何优化内嵌的Tomcat示例详解

    spring boot默认web程序启用tomcat内嵌容器,监听8080端口,下面这篇文章主要给大家介绍了关于Spring Boot如何优化内嵌Tomcat的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-09-09
  • Spring Boot项目中使用OpenAI-Java的示例详解

    Spring Boot项目中使用OpenAI-Java的示例详解

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程,这篇文章主要介绍了Spring Boot项目中使用OpenAI-Java的示例详解,需要的朋友可以参考下
    2023-04-04
  • springmvc后台基于@ModelAttribute获取表单提交的数据

    springmvc后台基于@ModelAttribute获取表单提交的数据

    这篇文章主要介绍了springmvc后台基于@ModelAttribute获取表单提交的数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • JAVA Spring中让人头痛的JAVA大事务问题要如何解决你知道吗

    JAVA Spring中让人头痛的JAVA大事务问题要如何解决你知道吗

    这篇文章主要介绍了Java Spring事务使用及验证过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-09-09
  • IDEA创建javaee项目依赖war exploded变红失效的解决方案

    IDEA创建javaee项目依赖war exploded变红失效的解决方案

    在使用IntelliJ IDEA创建JavaEE项目时,可能会遇到Tomcat部署的warexploded文件出现问题,解决方法是首先删除有问题的warexploded依赖,然后根据图示重新导入项目,此外,调整虚拟路径有时也能有效解决问题
    2024-09-09
  • java获取登录者IP和登录时间的两种实现代码详解

    java获取登录者IP和登录时间的两种实现代码详解

    这篇文章主要介绍了java获取登录者IP和登录时间的实现代码,本文通过两种结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • 如何在Spring Boot中使用MyBatis访问数据库

    如何在Spring Boot中使用MyBatis访问数据库

    MyBatis可以通过简单的XML或者注解来配置和映射原始类型,接口,和Java POJO为数据库中记录,使用MyBatis帮助我们解决各种问题,本文介绍如何在Spring Boot中使用MyBatis访问数据库,感兴趣的朋友一起看看吧
    2023-11-11
  • itext生成PDF设置页眉页脚的实例详解

    itext生成PDF设置页眉页脚的实例详解

    这篇文章主要介绍了itext生成PDF设置页眉页脚的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09

最新评论