在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
nlogn,马上想到快排,只不过这个链表没有数组好操作,所以使用了两个节点都从头开始往后走的实现方式
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func sortList(head *ListNode) *ListNode {
if head == nil {
return head
}
sorts(head, nil)
return head
}
func sorts(head, end *ListNode) {
node1 := head.Next
node2 := head.Next
tail := head
for node2 != end {
if node2.Val < head.Val {
if node1 != node2 {
node1.Val, node2.Val = node2.Val, node1.Val
}
tail = node1
node1 = node1.Next
node2 = node2.Next
} else {
node2 = node2.Next
}
}
if tail != head {
head.Val, tail.Val = tail.Val, head.Val
sorts(head, node1)
}
if node1 != end {
sorts(node1, end)
}
}
提交完发现评论都是用归并做的,有时间再写个归并的做法