leetcode sort list

本文介绍了一种基于链表的归并排序算法实现方法,该算法的时间复杂度为O(nlogn)。通过递归将链表分成两半,分别排序后再合并,详细展示了合并两个有序链表的过程及链表的创建方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目要求时间复杂度为O(nlogn),符合要求的排序算法有快速排序,归并排序,堆排序。


此出利用归并排序方法

代码

ListNode * mergeList(ListNode * fast, ListNode * slow)
{
	if(fast == NULL) return slow;
	if(slow == NULL) return fast;

	ListNode * res, *p;
	if(fast ->val < slow ->val)
	{
		res = fast;
		fast = fast -> next;
	}
	else
	{
		res = slow;
		slow = slow ->next;
	}


	//利用p来遍历,res记录合并后的头节点位置
	p = res;

	while(fast != NULL && slow != NULL)
	{
		if(fast ->val < slow ->val)
		{
			p->next = fast;
			fast = fast -> next;
		}
		else
		{
			p ->next = slow;
			slow = slow ->next;
		}	
		p = p ->next;
	}


	if(fast != NULL)
		p->next = fast;
	else if(slow != NULL)
		p ->next = slow;


	return res;

}


ListNode *sortList(ListNode * head)
{
	if(head == NULL || head ->next == NULL)
		return head;
	else
	{
		ListNode * slow , * fast;
		slow = head;
		fast = head;
		
		while(fast ->next!= NULL && fast ->next ->next != NULL)
		{
			slow = slow ->next;
			fast = fast ->next ->next;	
		}

		fast = slow;
		slow = slow ->next;
		fast->next = NULL;

		fast = sortList(head);
		slow = sortList(slow);

		return mergeList(fast, slow);
	}


}

主要注意链表的创建

// 逆序创建链表
void creatList(ListNode *& head, int n)
{
	
	ListNode *p;
	int tempvalue;

	head = (ListNode*)malloc(sizeof(ListNode));
	head ->next = NULL;	

	for(int i = 0; i < n; ++i)
	{
		p = (ListNode*)malloc(sizeof(ListNode));
		cin>>p->val;
		p->next = head ->next;
		head ->next = p;
		
	}


}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值