题解 | #单链表的排序#

单链表的排序

https://www.nowcoder.com/practice/f23604257af94d939848729b1a5cda08

package main

import . "nc_tools"

/*
 * type ListNode struct{
 *   Val int
 *   Next *ListNode
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param head ListNode类 the head node
 * @return ListNode类
 */
func sortInList(head *ListNode) *ListNode {
	// 测试使用快排的情况下,会报内存超出的错误,使用递归的方式,然后进行归并排序。
	// 递归将链表拆成单个单个的节点
	// 节点排序,然后再合并
	if head == nil || head.Next == nil {
		return head
	}

	// 使用快慢指针,将链表拆分成两个
	slowHead, fastHead := head, head.Next
	fast := fastHead
	slow := slowHead
	for fast != nil && fast.Next != nil {
		if fast.Next.Next != nil {
			slow.Next = slow.Next.Next
			slow = slow.Next
			fast.Next = fast.Next.Next
			fast = fast.Next
		} else if slow.Next.Next != nil {
			slow.Next = slow.Next.Next
			slow = slow.Next
			break
		} else {
			break
		}
	}
	fast.Next = nil
	slow.Next = nil
	// 对拆分的两个链表继续拆分
	slow = sortInList(slowHead)
	fast = sortInList(fastHead)
	// 对拆分排序后的链表进行合并
	return merge(slow, fast)
}

// 合并链表
func merge(head1, head2 *ListNode) *ListNode {
	res := &ListNode{
		Val: 0,
	}
	head := res
	// 合并链表
	for head1 != nil && head2 != nil {
		if head1.Val > head2.Val {
			head.Next = head2
			head2 = head2.Next
			head = head.Next
		} else {
			head.Next = head1
			head1 = head1.Next
			head = head.Next
		}
	}
	// 如果还有剩下的,也要合并
	if head1 != nil {
		head.Next = head1
	}

	if head2 != nil {
		head.Next = head2
	}
	return res.Next
}

全部评论

相关推荐

繁华的街道两旁,湿漉漉的下午,两个青涩的脸庞互相张望。宽大卫衣下娇小的她,向我奔来。不约而同的卫衣,斯文的半框眼镜掩饰着一个穷臭屌丝气息。这是我和我牛爱网第一死忠粉兼专属女嘉宾最初的见面。火速恋爱,但是没有所谓的快节奏,相识半年,还是一样的热恋。吃着肉夹馍坐过西安的小三轮洱海边自行车的气球胖吃着她最喜欢的酸酸水果和小乳扇在南山某店爷爷穿孙子衣服,摸肥猫就算我在忙也要抽出时间陪她去吃他喜欢的漂亮饭生活总是平凡,但平凡不平淡还记得见面第一件事儿:“我去上个厕所。”现在早上第一件事儿:“拉*”第一次上我车的她:“我可以坐副驾吗?”现在的她:“老子把jio翘到上面得得挡到你后视镜。”这小孩,虽然花了我...
Stan_蹒跚者:确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务