如何将两个有序链表合成一个新的有序链表
基本思想
定义一个新链表,定义一个新链表的指针tempNode。当合并的两个链表的头节点指针都不指向空时,比较两个链表节点的值,找到里面较小的值的地址。让新链表的指针tempNode下一个节点指向该最小值的地址,然后让该较小值的地址头指针指向下个地址。当一个链表的头指针指向空时,把另一个链表剩下的地址都填到新链表后边。这样链表就合并成功。
图像解析
head1链表的指针指向了空就把tempNode指向head2指向的节点就行了。
代码
/**
* 当前节点类,在堆内存当中创建节点
*/
public class ListNode {
public int value; // 数据域
public ListNode next; // 下一个节点的地址域
public ListNode(int value){
this.value = value;
}
}
//链表的管理类
public class LinkList {
ListNode head = null;
// 写一个方法,创建链表,链表的插入方法
// 尾插法
public void insert(int value) {
ListNode listNode = new ListNode(value);
if (head == null){
head = listNode;
return;
}
ListNode tempNode = head;
while (tempNode.next !=null){
tempNode = tempNode.next;
}
tempNode.next = listNode;
}
// 输出链表的值
public void printLink() {
//定义右边指向链表当中的第一个节点
ListNode tempNode = head;
while (tempNode !=null){
System.out.print(tempNode.value);
tempNode = tempNode.next;
}
}
//合并两个有序链表
public void hebing(ListNode head1, ListNode head2) {
ListNode headNode = new ListNode(0);
ListNode tempNode = headNode;
while (head1 != null && head2 != null) {
if (head1.value < head2.value) {
tempNode.next = head1;
head1 = head1.next;
} else {
tempNode.next = head2;
head2 = head2.next;
}
tempNode = tempNode.next;
}
if (head1 == null) {
tempNode.next = head2;
}
if (head2 == null) {
tempNode.next = head1;
}
head = headNode.next;
}
}
实现代码
public class Main {
public static void main(String[] args) {
LinkList head2 = new LinkList();
head2.insert(2);
head2.insert(5);
head2.insert(8);
head2.insert(10);
LinkList head1 = new LinkList();
head1.insert(1);
head1.insert(4);
head1.insert(7);
head1.insert(9);
System.out.println("合并之前输出两个有序链表");
System.out.println("链表1");
head1.printLink();
System.out.println(" ");
System.out.println("链表2");
head2.printLink();
System.out.println(" ");
LinkList x = new LinkList();
x.hebing(head1.head, head2.head);
System.out.println("合并之后输出合并好的有序链表");
x.printLink();
}
}