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

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

一、问题描述

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

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索链表
, 合并
逆转交替
单向链表逆转、单链表逆转、逆转链表、逆转线性单链表的算法、链表的逆转,以便于您获取更多的相关知识。

时间: 2024-11-01 16:41:34

逆转交替合并两个链表的解析与实现_java的相关文章

剑指Offer之合并两个排序的链表

题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. (hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为两个整数n和m(0<=n<=1000, 0<=m<=1000):n代表将要输入的第一个链表的元素的个数,m代表将要输入的第二个链表的元素的个数. 下面一行包括n个数t(1<=t<=1000000):代表链表一中的元素.接下来一行包含m个元素,s(1

剑指offer系列之十五:合并两个排序的链表

题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 这道题我的第一思路这样的:可以先遍历这两个排序的链表,把遍历的结果存放在一个集合中,然后调用库函数Arrays.sort方法完成排序,之后,根据这些排好序的结果重新创建一个链表,即为合并之后但仍然排序的链表.但是这种思路需要额外的List和创建链表的空间开销,而且时间复杂度最快也是O(nlogn).所以不是很理想.第二种思路是这样的:因为两个链表都是排序的,所以可以先比较两个链表的头结点,这样

探讨:将两个链表非降序合并为一个链表并依然有序的实现方法_C 语言

已知两个链表list1和list,2,各自非降序排列,将它们合并成另外一个链表list3,并且依然有序,要求保留所有节点.实现过程中,list1中的节点和list2中的节点都转移到了list3中,注意泛型的友元函数的用法.程序如有不足之处,还望指正!!!定义List类 复制代码 代码如下: #include "stdafx.h"#include <iostream> using namespace std;template<class T>struct Node

单链表问题(反转、是否有环、删除结尾第N个节点、合并两个sortlist、找到交点)

1.时间复杂度O(N),内存O(1)的效率下实现单链表的翻转 public static TreeNode revers(TreeNode head){ TreeNode temp,first,second; first=head; second=head.next; while(second!=null){ temp=second.next; second.next=first; first=second; second=temp; } head.next=null; head=first;

《剑指offer》-合并两个排序的链表

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. class Solution{ public: ListNode* Merge(ListNode* pHead1, ListNode* pHead2){ ListNode* result = NULL; ListNode* current = NULL; if (pHead1 == NULL){ return pHead2; } if (pHead2 == NULL){ return pHead1; }

LeetCode 21 Merge Two Sorted Lists(合并两个已排序的数组)

翻译 合并两个排好序的链表,并返回这个新链表. 新链表应该由这两个链表的头部拼接而成. 原文 Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists. 代码 /** * Definition for singly-linked list. * struct ListNode

wav合并-java 怎么合并两个wav的音频文件,实现混音效果

问题描述 java 怎么合并两个wav的音频文件,实现混音效果 现在想搞一下,把两个wav文件合并成一个实现混音效果,哪位了解怎么实现啊? 解决方案 http://pan.baidu.com/s/1c0nuR6K 解决方案二: http://pan.baidu.com/s/1c0nuR6K

python实现合并两个数组的方法

  本文实例讲述了python实现合并两个数组的方法.分享给大家供大家参考.具体如下: python合并两个数组,将两个数组连接成一个数组,例如,数组 a=[1,2,3] ,数组 b=[4,5,6],连接后:[1,2,3,4,5,6] 方法1 ? 1 2 3 a=[1,2,3] b=[4,5,6] a=a+b 方法2 ? 1 2 3 a=[1,2,3] b=[4,5,6] a.extend(b) 希望本文所述对大家的Python程序设计有所帮助.

如何求两个链表的第一个公共结点

题目: 输入两个链表, 找出它们的第一个公共结点. 计算链表的长度, 然后移动较长链表的指针, 使其到相同结点的距离的相同, 再同时移动两个链表的指针, 找到相同元素. 时间复杂度: O(n) 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h> #include <stdlib.h> #include <stri