链表排序

1.实现思路
与数组归并排序相同,主要分为以下三个步骤:
一、找到链表中点。最常用的方法是双指针法;
二、递归左半链表及右半链表。数组有很好的随机访问特点,因此传递索引来实现递归左子区间和右子区间;而在链表中,是顺序访问的,但是链表的插入删除是很方便的,因此考虑直接将链表从中间“打断”,然后递归“打断”后的两个链表。
三、合并链表。经②后的两个链表递归结束后必定都是有序的,因此这里就是对两个有序链表进行合并,可参考此处。另外一方法是递归合并,升序递归中,先找到两个链表中较小结点所在链表,将该链表剩下部分与另一个链表进行递归合并即可。

2.代码实现

ListNode* sortList(ListNode* head){
	if(!head || head->next == NULL)
		return head;
	//找出链表中点
	ListNode* slow = head;
	ListNode* fast = head;
	while(fast->next && fast->next->next){
		slow = slow->next;
		fast = fast->next->next;
	}
	ListNode* breakNode = slow->next;
	slow->next = NULL;
	ListNode* l = sortList(head);
	ListNode* r = sortList(breakNode);
	return mergeList(l, r);
}
ListNode* mergeList(ListNode* l1, ListNode* l2);
	if(!l1)
		return l2;
	if(!l2)
		return l1;
	if(l1 < val < l2->val){
		l1->next = mergeList(l1->next, l2);
		return l1;
	}
	else{
		l2->next = mergeList(l2->next, l1);
		return l2;
	}
	return NULL;
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值