递归实现合并单链表(java)
来源:互联网 发布:php 获取数组某个元素 编辑:程序博客网 时间:2024/06/06 05:49
题目描述:
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。(hint: 请务必使用链表。)
输入:
输入可能包含多个测试样例,输入以EOF结束。对于每个测试案例,输入的第一行为两个整数n和m(0<=n<=1000, 0<=m<=1000):n代表将要输入的第一个链表的元素的个数,m代表将要输入的第二个链表的元素的个数。下面一行包括n个数t(1<=t<=1000000):代表链表一中的元素。接下来一行包含m个元素,s(1<=t<=1000000)。
输出:
对应每个测试案例,若有结果,输出相应的链表。否则,输出NULL。
样例输入:
5 21 3 5 7 92 40 0
样例输出:
1 2 3 4 5 7 9NULL!
如下图所示:现有两个有序单链表,链表1和链表2,合并链表1和链表2生成有序的单链表3。
分析两个链表的合并过程。我们的分析从合并两个链表的头结点开始,链表1的头结点小于链表2 的头结点,所以链表1的头结点将会成为合并链表后的头结点。
当我们得到两个链表中最小的头结点,并将它链接到已合并的链表中。剩下的两个链表依然是两个有序的单链表,因此合并的步骤和先前的步骤是一样的。这就是一个典型的递归过程。
public static Node Merge(Node pHeader1,Node pHeader2){ if(pHeader1 == null) return pHeader2; if(pHeader2 == null) return pHeader1; Node mergeHeader = null; if(pHeader1.getValue()<pHeader2.getValue()){ mergeHeader = pHeader1; mergeHeader.setNextNode(Merge(pHeader1.getNextNode(),pHeader2)); }else{ mergeHeader = pHeader2; mergeHeader.setNextNode(Merge(pHeader1,pHeader2.getNextNode())); } return mergeHeader; }
实现代码:
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.StreamTokenizer;class Node { private int value; private Node nextNode; public int getValue() { return value; } public void setValue(int value) { this.value = value; } public Node getNextNode() { return nextNode; } public void setNextNode(Node nextNode) { this.nextNode = nextNode; } public Node(int value,Node nextNode) { this.value = value; this.nextNode = null; } } public class MergeList{ public static Node Merge(Node pHeader1,Node pHeader2){ if(pHeader1 == null) return pHeader2; if(pHeader2 == null) return pHeader1; Node mergeHeader = null; if(pHeader1.getValue()<pHeader2.getValue()){ mergeHeader = pHeader1; mergeHeader.setNextNode(Merge(pHeader1.getNextNode(),pHeader2)); }else{ mergeHeader = pHeader2; mergeHeader.setNextNode(Merge(pHeader1,pHeader2.getNextNode())); } return mergeHeader; } public static void main(String[] args) throws IOException { StreamTokenizer cin = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); while(cin.nextToken() != cin.TT_EOF){ int n = (int)cin.nval; cin.nextToken(); int m = (int)cin.nval; if(n==0 && m==0){ System.out.println("NULL"); continue; } cin.nextToken(); Node pHeader1 = new Node((int)cin.nval,null),current=pHeader1; for(int i=0;i<n-1;i++){ cin.nextToken(); current.setNextNode(new Node((int)cin.nval,null)); current = current.getNextNode(); } cin.nextToken(); Node pHeader2 = new Node((int)cin.nval,null); current=pHeader2; for(int i=0;i<m-1;i++){ cin.nextToken(); current.setNextNode(new Node((int)cin.nval,null)); current = current.getNextNode(); } Node mergeHeader = Merge(pHeader1,pHeader2); StringBuilder str = new StringBuilder(); while(mergeHeader != null){ str.append(mergeHeader.getValue()+" "); mergeHeader = mergeHeader.getNextNode(); } System.out.println(str.substring(0, str.length()-1)); } }}
0 0
- 递归实现合并单链表(java)
- 合并有序单链表(递归实现)
- 合并两个有序链表(Java递归实现)
- Java 非递归 和非递归方法 实现两个有序单链表的合并
- 单链表的合并(递归、非递归)
- 递归实现合并排序
- 剑指Offer 面试题25:合并两个排序的链表(递归+非递归) Java代码实现
- 自然合并排序的java实现(合并排序的非递归实现)
- 非递归实现合并排序
- 合并排序非递归实现
- 合并排序的递归实现
- 有序单链表合并(递归法)
- 合并排序(递归)
- JAVA 合并排序(递归算法)
- java递归浅析合并排序
- java实现单链表反转(递归方式)
- 单链表反转(非递归java实现)
- 有序链表的合并(递归实现)
- C语言深度解剖读书笔记之——C语言基础测试题
- [android] Handler机制
- bzoj 2132: 圈地计划
- Moravec算法的matlab代码
- 秒杀多线程第三篇 原子操作 Interlocked系列函数
- 递归实现合并单链表(java)
- Swap Nodes in Pairs
- spring读取properties配置文件失败
- C语言程序设计提高篇应用程序设计-CSDN银行2.0
- Huawei Talk Band B2 Smart Bracelet Fitness Wearable Health Sports Compatible smart Mobile Phone
- Ubuntu14.04下安装Hadoop2.4.0 (伪分布模式)
- 算法分析之递归策略
- hdoj 1698 Just a Hook 【线段树 区间修改】【线段树 + lazy思想】
- C语言基础——笔记整理2