链表排序

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;
}
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页