您的位置:首页 > 编程语言 > Java开发

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 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: