//归并排序
注意合并时 排序使用两个指针 ,避免两次循环的排序方法
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类
* @return ListNode类
*/
public ListNode sortList (ListNode head) {
if(head==null||head.next==null){
return head;
}
//分
ListNode mid = getmid(head);
ListNode head2 = mid.next;
mid.next=null;
head=sortList(head);
head2=sortList(head2);
//归
head = merge(head,head2);
return head;
}
public ListNode merge(ListNode head1,ListNode head2){
//定义两个指针结点
ListNode temp2 = head2;
ListNode head = new ListNode(0);//任意设置一个临时首节点
head.next=head1;//定义一个临时首结点
ListNode temp1 = head;
while(temp1.next!=null&&temp2!=null){//边界条件
//指针移动比较两指针结点处的val值
//如果temp1.next<temp2的val值,将temp2的val赋给node,并插入head1中, 使用temp1.next的原因是便于
//找到比较结点的上一个节点,方便插入
if(temp1.next.val>temp2.val){
//temp2结点复制到node,temp2指针向后移动一位,node断链
ListNode node = temp2;
temp2=temp2.next;
node.next=null;
//将node插入到head1中,更新temp1
node.next=temp1.next;
temp1.next=node;
temp1=node;
}else{//如果>=则,temp1向后移动
temp1=temp1.next;
}
}
//若temp1.next==null,则将temp2的后续元素全部插入到temp1之后
if(temp1.next==null){
temp1.next=temp2;
}
return head.next;
}
public ListNode getmid(ListNode head){
ListNode temp = head;
int count = 1;
while(temp.next!=null){
temp=temp.next;
count++;
}
if(count==2){
return head;
}
int mid = count/2+1;
temp = head;
while(count!=mid){
temp=temp.next;
count--;
}
return temp;
}
}
京公网安备 11010502036488号