148.M 排序链表

Problem: 148. 排序链表

思路

链表排序的复杂度在于节点交换位置比较复杂,但是合并两个有序链表很简单,因此考虑先把链表拆成两个部分,然后分别排序,排序好之后再合并两个链表。

Code

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func sortList(head *ListNode) *ListNode {
	if head == nil || head.Next == nil {
		return head
	}

    // 注意:如果fast也从head开始,在链表长度为2时,会导致左半部分的长度一直是2
	fast, slow := head.Next, head
	for fast != nil && fast.Next != nil {
		fast = fast.Next.Next
		slow = slow.Next
	}

	mid := slow.Next
	slow.Next = nil

	return mergeList(sortList(head), sortList(mid))
}

func mergeList(head1 *ListNode, head2 *ListNode) *ListNode {
	dummyHead := &ListNode{Val: -1}
	pre := dummyHead
	for head1 != nil && head2 != nil {
		if head1.Val < head2.Val {
			pre.Next = head1
			head1 = head1.Next
		} else {
			pre.Next = head2
			head2 = head2.Next
		}

		pre = pre.Next
	}

	if head1 != nil {
		pre.Next = head1
	} else {
		pre.Next = head2
	}

	return dummyHead.Next
}

Last updated

Was this helpful?