leetcode 148. 排序链表 golang实现

描述
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。

示例 1:

输入: 4->2->1->3
输出: 1->2->3->4
示例 2:

输入: -1->5->3->4->0
输出: -1->0->3->4->5
思路
分治思想
1. 将链表切成两份 一直切到无法再切
2. 将切完的链表 合并 (参考21. 合并两个有序链表)
实现
func sortList(head *ListNode) *ListNode {
	left, right := curList(head)
	// 单个的链表不再切割 否则会一直切下去
	if left != nil && left.Next != nil{
		left = sortList(left)
	}

	if right != nil && right.Next != nil{
		right = sortList(right)
	}
	return mergeList(left, right)
}

// 利用快慢指针 找到链表中点
func curList(head *ListNode)(*ListNode, *ListNode){
	if head == nil{
		return nil, nil
	}

	fast := head.Next
	slow := head

	for fast != nil && fast.Next != nil{
		fast = fast.Next.Next
		slow = slow.Next
	}

	slowNext := slow.Next
	slow.Next = nil

	return head, slowNext
}

func mergeList(list1 *ListNode, list2 *ListNode) *ListNode {
	if list1 == nil {
		return list2
	} else if list2 == nil {
		return list1
	}

	var head = new(ListNode)
	var cur = head

	for list1 != nil && list2 != nil {
		if list1.Val < list2.Val {
			cur.Next = list1
			list1 = list1.Next
		} else {
			cur.Next = list2
			list2 = list2.Next
		}
		cur = cur.Next
	}

	if list1 == nil {
		cur.Next = list2
	} else {
		cur.Next = list1
	}

	return head.Next
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值