leetcode 148. 排序链表

在 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)
    }
}

 

提交完发现评论都是用归并做的,有时间再写个归并的做法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值