当前位置: 首页 > news >正文

待字闺中之快排单向链表;leetcode之Sort List

题目来源。待字闺中。原创@陈利人 。欢迎大家继续关注微信公众账号“待字闺中”

分析:思路和数据的高速排序一样,都须要找到一个pivot元素、或者节点。

然后将数组或者单向链表划分为两个部分。然后递归分别快排。

针对数组进行快排的时候,交换交换不同位置的数值。在分而治之完毕之后,数据就是排序好的。那么单向链表是什么样的情况呢?除了交换节点值之外。是否有其它更好的方法呢?能够改动指针,不进行数值交换。这能够获取更高的效率。

在改动指针的过程中。会产生新的头指针以及尾指针,要记录下来。在partition之后,要将小于pivot的的部分、pivot、以及大于pivot的部分又一次串起来成为一个singly linked list。

在partition时。我们用最后的节点作为pivot。当我们扫描链表时,假设节点值大于pivot,将节点移到尾部之后;假设节点小于。保持不变。

在递归排序时。我们先调用partition将pivot放到正确的为止并返回pivot,然后。递归左边。递归右边。最后在合成一个单链表。

详细代码例如以下:

#include <iostream>
#include <map>
#include <vector>
#include <assert.h>
using namespace std;

struct node
{
	int data;
	struct node* next;
	node(int x):data(x),next(NULL){}
};

node* partition(node* start,node* end,node** newHead,node** newEnd)
{
	node* provit = end,*tmp = NULL,*pre = NULL;
	while(start != provit)
	{
		if(start->data > provit->data)
		{
			tmp = start->next;
			if(pre)pre->next = tmp;
			start->next = NULL;
			end->next = start;
			end = start;
			start = tmp;
		}
		else
		{
			if(*newHead == NULL)*newHead = start;
			pre = start;
			start = start->next;
		}
	}
	if(*newHead == NULL)*newHead = provit;
	*newEnd = end;
	return provit;
}
node* GetTail(node* head)
{
	if(head == NULL)return NULL;
	while(head->next != NULL)head = head->next;
	return head;
}
node* QuickSort(node* head,node* end)
{
	if(head == NULL || head == end)return head;
	node* newHead = NULL,*newEnd = NULL;//此处不能用二维指针。不然partition调用*newHead解引用时会出错
	node* provit = partition(head,end,&newHead,&newEnd);
	if(newHead != provit)
	{
		node* tmp = newHead;
		while(tmp->next != provit)tmp = tmp->next;
		tmp -> next = NULL;
		newHead = QuickSort(newHead,tmp);
		tmp = GetTail(newHead);
		tmp->next = provit;
	}
	if(provit != newEnd)
	{
		provit->next= QuickSort(provit->next,newEnd);
	}
	return newHead;
}
void QuickSort(node** head)
{
	if(head == NULL)return;
	*head = QuickSort(*head,GetTail(*head));
}
void printLink(node* head)
{
	while(head != NULL)
	{
		cout << head->data <<" ";
		head = head->next;
	}
	cout << endl;
}
int main()
{
	int n,i,value;
	node* head,*q;
	cin >> n;
	for(i=0;i<n;i++)
	{
		cin >> value;
		if(i == 0)
		{
			head = new node(value);
			q = head;
		}
		else
		{
			node* p = new node(value);
			q->next = p;
			q = p;
		}
	}
	printLink(head);
	QuickSort(&head);
	printLink(head);
	return 0;
}


leetcode之

Sort List

 

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

该题用上面的方法会超时,能够使用归并排序

class Solution {
public:
    ListNode *sortList(ListNode *head) 
    {
    	if(!head || !head->next)return head;
    	ListNode* fast = head -> next -> next;//至少有两个节点
    	ListNode* slow = head;
    	while(fast)
    	{
    		fast = fast->next;
    		slow = slow->next;
    		if(!fast)break;
    		fast = fast->next;
    	}
    	ListNode* p = slow -> next;
    	slow -> next = NULL;
    	ListNode* q = sortList(head);
    	p = sortList(p);
    	head = NULL;
    	ListNode* tail = NULL;
    	while(q && p)
    	{
    		if(q->val > p->val)
    		{
    			if(!head)head = tail = p;
    			else
    			{
    				tail->next = p;
    				tail = tail->next;
    			}
    			p = p->next;
    		}
    		else
    		{
    			if(!head)head = tail = q;
    			else
    			{
    				tail->next = q;
    				tail = tail->next;
    			}
    			q = q->next;
    		}
    	}
    	if(p)
    	{
    		if(!head)head = tail = p;
    		tail->next = p;
    	}
    	if(q)
    	{
    		if(!head)head = tail = q;
    		else tail->next = q;
    	}
    	return head;
    }
};



转载于:https://www.cnblogs.com/gavanwanggw/p/6693286.html

相关文章:

  • 打造比Dictionary还要快2倍以上的字查找类
  • nginx调优操作之nginx隐藏其版本号
  • 图片视频制作方法
  • Rsyslog日志服务搭建
  • 2017年北京下半年软考网上报名时间和网址
  • 各大搜索引擎智能提示API(jsonp实现跨域自动补全建议)
  • SpringMVC传入参数
  • Vue SSR 从入门到 Case Study
  • Android学习笔记进阶20 之得到图片的缩略图
  • 解决面板里没有network manager图标的问题 ,也就是在桌面环境下,没有那个网络图标...
  • python类的继承、封装和多态
  • SQLite 索引(Index)
  • java zip 压缩与解压
  • linux shell 命令获取字符串/文件的MD5值
  • Promise使用手册
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 4个实用的微服务测试策略
  • 5、React组件事件详解
  • Android优雅地处理按钮重复点击
  • ERLANG 网工修炼笔记 ---- UDP
  • fetch 从初识到应用
  • Github访问慢解决办法
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Java IO学习笔记一
  • JavaScript 基础知识 - 入门篇(一)
  • java概述
  • Quartz初级教程
  • SegmentFault 2015 Top Rank
  • SpiderData 2019年2月25日 DApp数据排行榜
  • use Google search engine
  • 动态规划入门(以爬楼梯为例)
  • 前端代码风格自动化系列(二)之Commitlint
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 手机端车牌号码键盘的vue组件
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 交换综合实验一
  • #pragma once
  • #大学#套接字
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (pojstep1.1.2)2654(直叙式模拟)
  • (八)Flask之app.route装饰器函数的参数
  • (备忘)Java Map 遍历
  • (补)B+树一些思想
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (五)IO流之ByteArrayInput/OutputStream
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET Core 实现 Redis 批量查询指定格式的Key