Sort a linked list in O(n log n) time using constant space complexity.
/* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
* */
public class Sort_list {
public ListNode sortList(ListNode head) {
if(head == null||head.next == null){
return head;
}
ListNode mid = getMid(head);
ListNode midnext = mid.next;
mid.next = null;//将链表分成两个部分,head-fast;slow-链表最后节点
return mergeSort(sortList(head), sortList(midnext));//先分后并
}
public ListNode getMid(ListNode head){
if(head == null||head.next==null){
return head;
}
ListNode fast = head;
ListNode slow = head;
while(fast!=null&&fast.next!=null&&fast.next.next!=null){
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
public ListNode mergeSort(ListNode n1,ListNode n2){
ListNode preHead = new ListNode(0);//新建一个头节点
ListNode cur1 = n1;
ListNode cur2 = n2;
ListNode cur = preHead;
while (cur1 != null && cur2 != null) {
if (cur1.val < cur2.val) {
cur.next = cur1;
cur1 = cur1.next;
}else {
cur.next = cur2;
cur2 = cur2.next;
}
cur = cur.next;
}
cur.next = cur1 == null?cur2:cur1;
return preHead.next;
}
}
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
* */
public class Sort_list {
public ListNode sortList(ListNode head) {
if(head == null||head.next == null){
return head;
}
ListNode mid = getMid(head);
ListNode midnext = mid.next;
mid.next = null;//将链表分成两个部分,head-fast;slow-链表最后节点
return mergeSort(sortList(head), sortList(midnext));//先分后并
}
public ListNode getMid(ListNode head){
if(head == null||head.next==null){
return head;
}
ListNode fast = head;
ListNode slow = head;
while(fast!=null&&fast.next!=null&&fast.next.next!=null){
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
public ListNode mergeSort(ListNode n1,ListNode n2){
ListNode preHead = new ListNode(0);//新建一个头节点
ListNode cur1 = n1;
ListNode cur2 = n2;
ListNode cur = preHead;
while (cur1 != null && cur2 != null) {
if (cur1.val < cur2.val) {
cur.next = cur1;
cur1 = cur1.next;
}else {
cur.next = cur2;
cur2 = cur2.next;
}
cur = cur.next;
}
cur.next = cur1 == null?cur2:cur1;
return preHead.next;
}
}
本文介绍了一种使用归并排序思想实现的链表排序算法,该算法可以在O(nlogn)的时间复杂度内完成排序,并且仅使用常数级别的额外空间。通过递归地将链表分为两半,分别排序后再进行合并,最终实现整个链表的有序排列。
2306

被折叠的 条评论
为什么被折叠?



