/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode sortList(ListNode head) {
ListNode mid = getMid(head);
if(mid!=null){
head = sortList(head);
mid = sortList(mid);
head = merge(head,mid);
}
return head;
}
//有序链表的归并
public ListNode merge(ListNode head, ListNode mid){
ListNode p1 = head;
ListNode p2 = mid;
ListNode cur = null;
ListNode result = null;
while(p1!=null&&p2!=null){
if(p1.val <= p2.val){
if(result == null){//确定头结点
result = p1;
p1 = p1.next;
result.next = null;
cur = result;
}else{
cur.next= p1;
p1 = p1.next;
cur = cur.next;
cur.next = null;
}
}else{
if(result == null){//确定头结点
result = p2;
p2 = p2.next;
result.next = null;
cur = result;
}else{
cur.next= p2;
p2 = p2.next;
cur = cur.next;
cur.next = null;
}
}
}
if(p1!=null){
cur.next =p1;
}
if(p2!=null){
cur.next = p2;
}
return result;
}
//寻找链表的中间节点
private ListNode getMid(ListNode head){
if(head==null||head.next==null)
return null;
ListNode low = head;
ListNode fast = head.next;
ListNode mid = low;
ListNode tail = low;//以中间节点为界分成两个链表
while(fast!=null&&fast.next!=null){
tail = low;
low = low.next;
fast = fast.next.next;
}
if(fast==null){//奇数
tail.next = null;
mid = low;
}else if(fast.next==null)//偶数
{
mid = low.next;
low.next = null;
}
return mid;
}
}
题目描述
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode sortList(ListNode head) {
ListNode mid = getMid(head);
if(mid!=null){
head = sortList(head);
mid = sortList(mid);
head = merge(head,mid);
}
return head;
}
//有序链表的归并
public ListNode merge(ListNode head, ListNode mid){
ListNode p1 = head;
ListNode p2 = mid;
ListNode cur = null;
ListNode result = null;
while(p1!=null&&p2!=null){
if(p1.val <= p2.val){
if(result == null){//确定头结点
result = p1;
p1 = p1.next;
result.next = null;
cur = result;
}else{
cur.next= p1;
p1 = p1.next;
cur = cur.next;
cur.next = null;
}
}else{
if(result == null){//确定头结点
result = p2;
p2 = p2.next;
result.next = null;
cur = result;
}else{
cur.next= p2;
p2 = p2.next;
cur = cur.next;
cur.next = null;
}
}
}
if(p1!=null){
cur.next =p1;
}
if(p2!=null){
cur.next = p2;
}
return result;
}
//寻找链表的中间节点
private ListNode getMid(ListNode head){
if(head==null||head.next==null)
return null;
ListNode low = head;
ListNode fast = head.next;
ListNode mid = low;
ListNode tail = low;//以中间节点为界分成两个链表
while(fast!=null&&fast.next!=null){
tail = low;
low = low.next;
fast = fast.next.next;
}
if(fast==null){//奇数
tail.next = null;
mid = low;
}else if(fast.next==null)//偶数
{
mid = low.next;
low.next = null;
}
return mid;
}
}
Sort a linked list in O(n log n) time using constant space complexity.