148.排序链表

70 阅读1分钟

题目:
给你链表的头结点 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
}