java之合并链表的两种方法
2015-06-05 17:29
453 查看
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序。链表的结构如下:
class LNode { // 单链表的存储结构
int value;
LNode next;
public LNode() {
}
public LNode(int value) {
this.value = value;
this.next = null;
}
public LNode(int value, LNode next) {
this.value = value;
this.next = next;
}
}合并链表的两种方法:
package LinkList;
public class MergeMain {
// public LNode head = new LNode();// 创建空的头节点
public void insertHead(int value, LNode node) { // 插入节点,从头开始
LNode link = new LNode(value); // 创建一个带value值的节点
link.next = node.next;
node.next = link;
}
// 方法一,不用递归
public LNode Merge(LNode node1, LNode node2) {
if (node1 == null)
return node2;
if (node2 == null)
return node1;
LNode p1 = node1.next;
LNode p2 = node2.next;
LNode p;
p = node1;
while (p1 != null && p2 != null) {
if (p1.value <= p2.value) {
p.next = p1;
p = p1;
p1 = p1.next;
} else {
p.next = p2;
p = p2;
p2 = p2.next;
}
if (p1 != null) {
p.next = p1;
}
if (p2 != null) {
p.next = p2;
}
}
return node1;
}
public void print(LNode node) {
LNode p = node;
while (p != null) {
System.out.print(p.value + " ");
p = p.next;
}
}
// 方法二,使用递归调用
public LNode Merge1(LNode node1, LNode node2) {
if (node1 == null)
return node2;
else if (node2 == null)
return node1;
LNode pMergeHead = null;
if (node1.next.value < node2.next.value) {
pMergeHead = node1;
pMergeHead.next = Merge1(node1.next, node2);
} else {
pMergeHead = node2;
pMergeHead.next = Merge1(node1, node2.next);
}
return pMergeHead;
}
public static void main(String[] args) {
MergeMain mergeMain = new MergeMain();
LNode node1 = new LNode();
LNode node2 = new LNode();
for (int i = 20; i > 0; i -= 2) {
mergeMain.insertHead(i, node1);
}
System.out.println("打印链表1");
mergeMain.print(node1.next);
System.out.println();
for (int i = 22; i > 0; i -= 3) {
mergeMain.insertHead(i, node2);
}
System.out.println("打印链表2");
mergeMain.print(node2.next);
System.out.println();
LNode node3 = new LNode();
LNode node4 = new LNode();
for (int i = 20; i > 0; i -= 2) {
mergeMain.insertHead(i, node3);
}
System.out.println("打印链表1");
mergeMain.print(node3.next);
System.out.println();
for (int i = 22; i > 0; i -= 3) {
mergeMain.insertHead(i, node4);
}
System.out.println("打印链表2");
mergeMain.print(node4.next);
System.out.println();
System.out.println("1--------使用方法1来合并链表---------------");
LNode node = mergeMain.Merge(node1, node2);
mergeMain.print(node.next);
System.out.println();
System.out.println("1--------使用方法2来合并链表---------------");
LNode p = mergeMain.Merge(node3, node4);
mergeMain.print(p.next);
System.out.println();
}
}
打印结果:
打印链表1
2 4 6 8 10 12 14 16 18 20
打印链表2
1 4 7 10 13 16 19 22
打印链表1
2 4 6 8 10 12 14 16 18 20
打印链表2
1 4 7 10 13 16 19 22
1--------使用方法1来合并链表---------------
1 2 4 4 6 7 8 10 10 12 13 14 16 16 18 19 20 22
1--------使用方法2来合并链表---------------
1 2 4 4 6 7 8 10 10 12 13 14 16 16 18 19 20 22
class LNode { // 单链表的存储结构
int value;
LNode next;
public LNode() {
}
public LNode(int value) {
this.value = value;
this.next = null;
}
public LNode(int value, LNode next) {
this.value = value;
this.next = next;
}
}合并链表的两种方法:
package LinkList;
public class MergeMain {
// public LNode head = new LNode();// 创建空的头节点
public void insertHead(int value, LNode node) { // 插入节点,从头开始
LNode link = new LNode(value); // 创建一个带value值的节点
link.next = node.next;
node.next = link;
}
// 方法一,不用递归
public LNode Merge(LNode node1, LNode node2) {
if (node1 == null)
return node2;
if (node2 == null)
return node1;
LNode p1 = node1.next;
LNode p2 = node2.next;
LNode p;
p = node1;
while (p1 != null && p2 != null) {
if (p1.value <= p2.value) {
p.next = p1;
p = p1;
p1 = p1.next;
} else {
p.next = p2;
p = p2;
p2 = p2.next;
}
if (p1 != null) {
p.next = p1;
}
if (p2 != null) {
p.next = p2;
}
}
return node1;
}
public void print(LNode node) {
LNode p = node;
while (p != null) {
System.out.print(p.value + " ");
p = p.next;
}
}
// 方法二,使用递归调用
public LNode Merge1(LNode node1, LNode node2) {
if (node1 == null)
return node2;
else if (node2 == null)
return node1;
LNode pMergeHead = null;
if (node1.next.value < node2.next.value) {
pMergeHead = node1;
pMergeHead.next = Merge1(node1.next, node2);
} else {
pMergeHead = node2;
pMergeHead.next = Merge1(node1, node2.next);
}
return pMergeHead;
}
public static void main(String[] args) {
MergeMain mergeMain = new MergeMain();
LNode node1 = new LNode();
LNode node2 = new LNode();
for (int i = 20; i > 0; i -= 2) {
mergeMain.insertHead(i, node1);
}
System.out.println("打印链表1");
mergeMain.print(node1.next);
System.out.println();
for (int i = 22; i > 0; i -= 3) {
mergeMain.insertHead(i, node2);
}
System.out.println("打印链表2");
mergeMain.print(node2.next);
System.out.println();
LNode node3 = new LNode();
LNode node4 = new LNode();
for (int i = 20; i > 0; i -= 2) {
mergeMain.insertHead(i, node3);
}
System.out.println("打印链表1");
mergeMain.print(node3.next);
System.out.println();
for (int i = 22; i > 0; i -= 3) {
mergeMain.insertHead(i, node4);
}
System.out.println("打印链表2");
mergeMain.print(node4.next);
System.out.println();
System.out.println("1--------使用方法1来合并链表---------------");
LNode node = mergeMain.Merge(node1, node2);
mergeMain.print(node.next);
System.out.println();
System.out.println("1--------使用方法2来合并链表---------------");
LNode p = mergeMain.Merge(node3, node4);
mergeMain.print(p.next);
System.out.println();
}
}
打印结果:
打印链表1
2 4 6 8 10 12 14 16 18 20
打印链表2
1 4 7 10 13 16 19 22
打印链表1
2 4 6 8 10 12 14 16 18 20
打印链表2
1 4 7 10 13 16 19 22
1--------使用方法1来合并链表---------------
1 2 4 4 6 7 8 10 10 12 13 14 16 16 18 19 20 22
1--------使用方法2来合并链表---------------
1 2 4 4 6 7 8 10 10 12 13 14 16 16 18 19 20 22
相关文章推荐
- Windows下搭建Eclipse+Android4.0开发环境
- Java基础 异常-finally 包package
- 【Eclipse教程】 eclipse快捷键大全
- spring 的 AOP详解
- Spring 解决编码问题-CharacterEncodingFilter
- Java for LeetCode 160 Intersection of Two Linked Lists
- 简单页面下载实例
- Java中特殊的String
- Mac下修改Android Studio 所用的JDK版本
- javac命令和jar命令
- JAVA WEB项目中文乱码问题解决方案
- Java 基本方法连接数据库并且执行查询,你发现这个会有什么问题吗
- java随笔
- java Properties工具
- 顺手笔记---javac,javap,javah
- Java反射机制详解。
- javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher--转载
- Java语言描述:分支限界法之01背包问题
- Java for LeetCode 155 Min Stack
- Combination Sum III Leecode Java