基于归并排序的链表排序 O(Nlogn)
要点:
- 如何找到链表中的中心点——快慢“指针”
- 归并排序的实现——采用递归的思维
LinkNode.java
package cn.stu.test;
public class LinkNode {
int num;
LinkNode next;
public LinkNode(int num) {
super();
this.num = num;
this.next = null;
}
public LinkNode() {
super();
this.next = null;
}
}
LinkedListMergeSort.java
package cn.stu.test;
public class LinkedListMergeSort {
/*用于寻找链表的中心点*/
public static LinkNode getNode(LinkNode link){
LinkNode fast,slow;
fast = slow = link;
while(fast.next != null&&fast.next.next != null){
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
public static LinkNode sortMerge(LinkNode left,LinkNode right){
LinkNode Head = new LinkNode();
LinkNode temp = Head;
while(left!=null &&right != null){
if(left.num > right.num){
temp.next = left;
left = left.next;
}else{
temp.next = right;
right = right.next;
}
temp = temp.next;
}
temp.next = (left == null)?right:left;
return Head.next;
}
public static LinkNode sort(LinkNode link){
if(link.next == null){
return link;
}
LinkNode node = getNode(link);
LinkNode node2 = node.next;
node.next = null;
return sortMerge(sort(link),sort(node2));
}
public static void main(String[] args) {
LinkNode i1 = new LinkNode(98);
LinkNode i2 = new LinkNode(34);
LinkNode i3 = new LinkNode(43);
LinkNode i4 = new LinkNode(11);
LinkNode i5 = new LinkNode(44);
LinkNode i6 = new LinkNode(54);
LinkNode i7 = new LinkNode(12);
i1.next = i2;
i2.next = i3;
i3.next = i4;
i4.next = i5;
i5.next = i6;
i6.next = i7;
i7.next = null;
LinkNode node = i1;
while(node != null){
System.out.print(node.num+" ");//输出未排序的链表
node = node.next;
}
System.out.println();
System.out.println("----------------------------");
node = sort(i1);
while(node != null){
System.out.print(node.num+" ");//输出经过排序的链表
node = node.next;
}
}
}
重点在于理解中点的查找以及归并排序的思维