leetcode:Sort List

Sort List:  Total Accepted: 8953   Total Submissions:45805

Sort a linked list in O(n log n) time using constant space complexity.

Solution4.h

#include <stdio.h>
#include <iostream>
#include <string>
//#include <vector>
#include <stdlib.h> 
using namespace std;

struct ListNode 
{
     int val;
     ListNode *next;
     ListNode(int x) : val(x), next(NULL) {}
};

class Solution4
{
public:
	Solution4();
	~Solution4();
	ListNode *sortList(ListNode *head);
	ListNode *mergesort(ListNode *head);
	ListNode *merge(ListNode *h1, ListNode *h2);
};

Solution4.cpp:

#include "Solution4.h"
//#include <cmath>
using namespace std;
//#include <stack>

Solution4::Solution4()
{

}

Solution4::~Solution4()
{

}

ListNode* Solution4::sortList(ListNode *head)
{
	return mergesort(head);
}

ListNode* Solution4::mergesort(ListNode *head_1)
{
	if (head_1==NULL || head_1->next==NULL)
		return head_1;
	ListNode *p=head_1;
	ListNode *q=head_1;
	ListNode *pre=p;

	while (q!=NULL && q->next!=NULL)
	{
		//q每次移动两步,p移动一步,当q到大链表末尾时,p到达链表中间
		q=q->next->next;
		pre=p;
		p=p->next;   
	}
	pre->next=NULL;
	ListNode *h1=mergesort(head_1);
	ListNode *h2=mergesort(p);
	return merge(h1,h2);
}

ListNode* Solution4::merge(ListNode *h1, ListNode *h2)
{
	ListNode *dump=new ListNode(0);
	ListNode *p=dump;
	while (h1!=NULL && h2!=NULL)
	{
		if (h1->val< h2->val)
		{
			p->next=h1;
			h1=h1->next;
		}
		else
		{
			p->next=h2;
			h2=h2->next;
		}
		p=p->next;
	}
	if (h1!=NULL)
		p->next=h1;
	else p->next=h2;
	ListNode *head=dump->next;
	delete dump;
	return head;
}

main.cpp:

#include "Solution4.h"
#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
	//Solution4:
	Solution4 mysolution4;

	ListNode *head, *tail, *p, *temp;
	int i=0;
	head=tail=NULL;//开始都初始化是NULL
	printf("input a number\n");
	for(; i<6; i++)
	{
		printf("Please enter %dth Node data:",i);
		p=(ListNode *)malloc(sizeof(ListNode));//动态的构造一块内存空间,返回的是指向接点的指针
		scanf("%d",&p->val);;//赋值
		p->next=NULL;
		if(head==NULL)
			head=tail=p;//在头指针是NULL时候也就是说是一个空的单链,那么头尾都赋值是指针p
		else
			//tail=tail->next;//当头指针不是指向NULL时候的话,就是说这个链是存在的,现在是加进去尾指针就向下进一个
			tail->next=p;   //注意此处以及下面一句
		tail=p;//把尾指针的下一个赋值是新建的这个指针(创建单向链表)
	}

	ListNode *mysort=mysolution4.sortList(head);
	temp=(ListNode *)malloc(sizeof(ListNode));
	while (NULL != mysort)
	{
		//cout<<mysort->val<<endl;
		temp = mysort->next;
		cout<<mysort->val<<endl;
		mysort = temp;
	}
	
	return 0;
	system("pause");
}

总结:

主要考察对链表的掌握。之前对链表只是了解一点,通过这次对链表的排序等有了一定掌握。排序方法用的是上篇博文提到的归并法。

除了leetcode部分的代码,测试函数main.cpp中链表的初始化也需要注意。另外就是开始在 ListNode* Solution4::mergesort(ListNode *head_1) 中

while (q!=NULL && q->next!=NULL)
	{
		//q每次移动两步,p移动一步,当q到大链表末尾时,p到达链表中间
		q=q->next->next;
		pre=p;
		p=p->next;   
	}

循环中第二句与第三句颠倒了顺序,导致stackoverflow错误,后来检查才发现。

根据,题目要求在O(n log n)的时间复杂度和常数级空间复杂度下对链表进行排序。根据提供的代码,可以使用归并排序来解决这个问题。代码中的sortList函数是递归函数,首先判断链表是否为空或者只有一个节点,如果是的话直接返回该链表。然后通过快慢指针找到链表的中点,将链表分成两半,再递归地对两个子链表进行排序。最后,使用merge函数将两个有序的子链表合并成一个有序的链表。merge函数通过比较两个链表节点的值来确定节点的顺序,然后将节点逐个连接起来。整个过程可以保证链表最终被排序。因此,可以使用该方法解决leetcode 148的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [leetcode 148 排序链表 C语言](https://blog.csdn.net/qq_42007287/article/details/104730970)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [LeetCode:148. Sort List 排序链表(C语言)](https://blog.csdn.net/wangqingchuan92/article/details/104037031)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [LeetCode 148. Sort List](https://blog.csdn.net/smmyy022/article/details/82937283)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值