import java.util.*; public class Solution { /** * @param head ListNode类 the head node * @return ListNode类 */ //由于时间复杂度只能采用快排,堆排,归并 //以下代码使用归并排序,合并两个有序链表,也是归并的一个体现, //定义三个指针,快指针每次走两步,慢指针走一步,将链表分为两部分。 //依次分割,分到一个时就相当于一个有序链表,然后重新组成的方式就与合并有序链表一样。 public ListNode sortInList (ListNode head) { if(head==null||head.next==null){ return head; } //分割链表 ListNode left = head; ListNode mid = head.next; ListNode right = head.next.next; while(right != null && right.next != null){ left = left.next;//走到中间的前驱 mid = mid.next;//走到中间 right = right.next.next;//走到最后 } //断开得到两个链表 left.next = null; //合并两个链表 return merge(sortInList(head), sortInList(mid)); } ListNode merge(ListNode p1,ListNode p2){ if(p1==null){ return p2; } if(p2==null){ return p1; } //加一个表头 ListNode head = new ListNode(0); ListNode cur = head; //两个链表都要不为空 while(p1 != null && p2 != null){ //取较小值的节点 if(p1.val <= p2.val){ cur.next = p1; p1 = p1.next; }else{ cur.next = p2; p2 = p2.next; } //指针后移 cur = cur.next; } //哪个链表还有剩,直接连在后面 if(p1 != null) cur.next = p1; else cur.next = p2; //返回值去掉表头 return head.next; } }