
思路
func sortList(head *ListNode) *ListNode {
if head == nil {
return head
}
listLength := 0
for node := head; node != nil; node = node.Next{
listLength++
}
dummyHead := &ListNode{Next:head}
for subLength:=1; subLength < listLength ; subLength<<=1{
pre := dummyHead
cur := dummyHead.Next
for cur != nil {
head1 := cur
for i:=1; i<subLength && cur.Next != nil; i++ {
cur = cur.Next
}
head2 := cur.Next
cur.Next = nil
cur = head2
for i:= 1; i<subLength && cur !=nil && cur.Next != nil; i++{
cur=cur.Next
}
var next *ListNode
if cur != nil {
next = cur.Next
cur.Next = nil
}
newHead, newTail := sort(head1, head2)
pre.Next = newHead
newTail.Next = next
cur = next
pre = newTail
}
}
return dummyHead.Next
}
func sort(head1, head2 *ListNode) (head, tail *ListNode){
dummyNode := &ListNode{}
cur := dummyNode
n1, n2 := head1, head2
for ; n1 != nil && n2 != nil; {
if n1.Val <= n2.Val {
cur.Next = n1
cur = cur.Next
n1 = n1.Next
}else{
cur.Next = n2
cur = cur.Next
n2 = n2.Next
}
}
if n1 != nil {
cur.Next = n1
for cur.Next != nil {
cur = cur.Next
}
}
if n2 != nil {
cur.Next = n2
for cur.Next != nil {
cur = cur.Next
}
}
return dummyNode.Next, cur
}