题目:
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
算法:
这里时归并排序的思想。
思路要清晰,代码才简单。实现思路清晰的途径是先写接口,再写实现
func sortList(head *ListNode) *ListNode {
// 递归要考虑跳出循环的条件
// 要设置单节点跳出循环条件head.Next == nil,缺了这个条件单节点始终无法跳出循环。
if head == nil || head.Next == nil {
return head
}
mid := getMid(head)
rightHalf := sortList(mid.Next)
// 切断左右两条链表
mid.Next = nil
leftHalf := sortList(head)
// 合并leftHalf,rightHalf
dummy := &ListNode{}
cur := dummy
for rightHalf != nil && leftHalf != nil {
if rightHalf.Val < leftHalf.Val {
cur.Next = rightHalf
rightHalf = rightHalf.Next
} else {
cur.Next = leftHalf
leftHalf = leftHalf.Next
}
cur = cur.Next
}
if leftHalf != nil {
cur.Next = leftHalf
}
if rightHalf != nil {
cur.Next = rightHalf
}
return dummy.Next
}
func getMid(head *ListNode) *ListNode {
if head.Next == nil {
return head
}
slow, fast := head, head
for fast.Next != nil && fast.Next.Next != nil {
fast = fast.Next.Next
slow = slow.Next
}
return slow
}