需求
思路
排序:讲所有的值都取出来,存储到ArrayList中,然后排序,将排序之后的元素依次使用add方法添加到自定义链表
合并排序:先合并,然后调用刚才写的排序算法 合并:将表一的头结点作为新链表的头结点,表一的尾节点指向表二的头结点
代码
自定义链表
public class MyLinkedList < E > {
Node < E > head = null ;
public Node < Integer > merge ( Node < Integer > head1, Node < Integer > head2) {
if ( head1 == null ) {
return head2;
}
if ( head2 == null ) {
return head1;
}
Node < Integer > tmp = head1;
while ( tmp. next != null ) {
tmp = tmp. next;
}
tmp. next = head2;
MyLinkedList < Integer > myLinkedList = new MyLinkedList < > ( ) ;
myLinkedList. head = head1;
return myLinkedList. sorted ( ) ;
}
public static class Node < E > {
E data;
Node < E > next;
public Node ( E data, Node < E > next) {
this . data = data;
this . next = next;
}
}
public void add ( E e) {
Node < E > newNode = new Node < > ( e, null ) ;
if ( head == null ) {
head = newNode;
return ;
}
Node < E > temp = head;
while ( temp. next != null ) {
temp = temp. next;
}
temp. next = newNode;
}
public Node < E > sorted ( ) {
if ( head == null || head. next == null ) {
return head;
}
List < E > list = new ArrayList < > ( ) ;
while ( head != null ) {
list. add ( head. data) ;
head = head. next;
}
list. sort ( ( o1, o2) -> {
if ( o1 instanceof Integer ) {
return ( Integer ) o1 - ( Integer ) o2;
}
return 0 ;
} ) ;
MyLinkedList < E > myLinkedList = new MyLinkedList < > ( ) ;
for ( E e : list) {
myLinkedList. add ( e) ;
}
return myLinkedList. head;
}
public static void forEachPrint ( MyLinkedList. Node < Integer > sorted1) {
while ( sorted1 != null ) {
System . out. print ( sorted1. data+ " " ) ;
sorted1 = sorted1. next;
}
}
}
使用
public class Test {
public static void main ( String [ ] args) {
MyLinkedList myLinkedList1 = new MyLinkedList ( ) ;
myLinkedList1. add ( 2 ) ;
myLinkedList1. add ( 4 ) ;
myLinkedList1. add ( 1 ) ;
MyLinkedList. Node < Integer > head1 = myLinkedList1. head;
MyLinkedList myLinkedList2 = new MyLinkedList ( ) ;
myLinkedList2. add ( 9 ) ;
myLinkedList2. add ( 1 ) ;
myLinkedList2. add ( 3 ) ;
MyLinkedList. Node < Integer > head2 = myLinkedList2. head;
MyLinkedList. Node < Integer > sorted1 = myLinkedList1. sorted ( ) ;
MyLinkedList. Node < Integer > sorted2 = myLinkedList2. sorted ( ) ;
System . out. println ( "排序后的链表1:" ) ;
MyLinkedList . forEachPrint ( sorted1) ;
System . out. println ( ) ;
System . out. println ( "排序后的链表2:" ) ;
MyLinkedList . forEachPrint ( sorted2) ;
MyLinkedList. Node < Integer > merge = myLinkedList1. merge ( head1, head2) ;
System . out. println ( ) ;
System . out. println ( "合并后的链表:" ) ;
MyLinkedList . forEachPrint ( merge) ;
}
}