Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >单链表归并排序

单链表归并排序

作者头像
lexingsen
发布于 2022-02-24 12:14:12
发布于 2022-02-24 12:14:12
27400
代码可运行
举报
文章被收录于专栏:乐行僧的博客乐行僧的博客
运行总次数:0
代码可运行

单链表归并排序需要掌握的知识点。 1.归并排序的思想 2.如何合并两个有序的单链表 3.如何找到一个链表的中间节点,这里是为了断链。将链表一分为二。

(1)合并两个有序的链表,主要有两种思路。递归和迭代 递归方法的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct node {
	int val;
	node *next;
};
//注意此时链表a和链表b均为递增有序的单链表
node *merge(node *a, node *b) {
	if (!a) return b;
	if (!b) return a;
	if (a->val <= b->val) {
		a->next = merge(a->next, b);
		return a;
	} else {
		b->next = merge(b->next, a);
		return b;
	}
}

迭代方法的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
node *merge(node *a, node *b) {
	node *dummy = new node(0);//建立虚拟节点
	node *p = dummy;
	while (a && b) {
		if (a->val <= b->val) {
			p->next = a;
			a = a->next;
		} else {
			p->next = b;
			b = b->next;
		}
		p = p->next;
	}
	//退出while循环  可能是a==NULL 或者 b==NULL 或者  a==NULL && b==NULL
	//但是我们需要把不空的那条链继续连上
	p->next = (a!=NULL)?a:b;
	return dummy->next;
}

(2) 链表的归并排序,其实也是递归的处理两个子链,最后合并两个有序的链表。这里主要的难点是如何找到链表的中点进行断链。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
node *_mergeSort(node *head) {
	if (!head->next) return head; //如果链表中只有一个节点, 即为递归出口,直接返回
	/*
	使用快慢指针,(1)慢指针规规矩矩每次只走一步
				 (2)快指针每次走两步
	*/
	node *slow = head;//最终指向第二条链的第一个节点
	node *fast  = head;
	node *pre   = NULL;//最终指向第一条链的最后一个节点	
	while (fast && fast->next) {
		pre = p;
		slow = slow->next;
		fast = fast->next->next;
	}
	pre->next = NULL;//这一步很关键  就是在断链
	node *left  = mergeSort(head);//递归的排序以head为头指针的第一条链
	node *right = mergeSort(slow);
	return merge(left, right);
}

node *mergeSort(node *head) {
	if (!head) return NULL;
	else return _mergeSort(head); 
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
算法笔记学习-链表
灵活使用递归。构造递归条件,使用递归可以巧妙的解题。不过需要注意有些题目不能使用递归,因为递归深度太深会导致超时和栈溢出。
买唯送忧
2021/05/29
2670
【算法/学习】:搞懂链表题型,这一篇就够了
链表(Linked List) 是一种线性数据结构,由一系列节点组成。每个节点包含两个部分:
IsLand1314
2025/02/25
1050
【算法/学习】:搞懂链表题型,这一篇就够了
【LeetCode热题100】【链表】排序链表
要排序一个链表,最快的方法是用一个数组将链表节点的值存起来然后排序数组后重新构建链表
叶茂林
2024/04/23
1180
Leetcode No.148 排序链表(归并)
你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?
week
2021/11/29
2560
面试官系列 - LeetCode链表知识点&题型总结
前段时间,写了面试必备的一系列文章,反应还不错。有一些读者反馈说,能不能整理一些面试常见的算法。前段时间,我恰好总结了 LeetCode 常见的面试算法题目。今天给大家分享一下。
程序员徐公
2022/01/20
6920
面试官系列 - LeetCode链表知识点&题型总结
2021-03-16:手写代码:单链表归并排序。
2021-03-16:手写代码:单链表归并排序。 福大大 答案2021-03-16: 获取链表中点,然后按中点分成两个链表。递归两个链表。合并两个链表。 代码用golang编写,代码如下: package main import "fmt" func main() { //head := &ListNode{Val: 4} //head.Next = &ListNode{Val: 2} //head.Next.Next = &ListNode{Val: 1} //head
福大大架构师每日一题
2021/03/16
3550
【Leetcode】单链表常见题
首先,这道题需要删除元素,我可以初始化一个结构体指针cur进行遍历链表,对于每个节点,检查它的值是否等于val,如果cur指向的节点值等于val,则需要删除这个节点,这里一个结构体指针是不够的,是因为单链表的单向性,我们则需要再定义另一个指针prev来实现
用户11029103
2024/04/02
1120
【Leetcode】单链表常见题
力扣148——排序链表
原题url:https://leetcode-cn.com/problems/sort-list/
健程之道
2020/02/12
3490
单链表插入排序
单链表的插入排序在思路上与顺序表是一致的,它的难点在于如何对链表进行操作,包括链表的插入以及防止访问空节点。只有能够保证思路清晰,写出也是不难的。
lexingsen
2022/02/24
4160
​精益求精单链表归并排序与快速排序
本节主要阐述自顶向下与自底向上的归并排序,以及改变连接状态与改变节点值的可快速排序。下面来仔细阐述。
公众号guangcity
2019/09/20
2.2K0
数据结构--链表--单链表归并排序mergesort
3.归并操作,对两两链表进行合并排序,并返回回并后的链表的头结点,依次向上递归回去
Michael阿明
2021/02/20
5470
数据结构--链表--单链表归并排序mergesort
LeetCode 148. 排序链表(归并排序、快速排序)
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/sort-list 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Michael阿明
2020/07/13
1.2K0
LeetCode 148. 排序链表(归并排序、快速排序)
排序链表(LeetCode 148)
寻找链表的中点可以使用快慢指针的做法,快指针每次移动 222 步,慢指针每次移动 111 步,当快指针到达链表末尾时,慢指针指向的链表节点即为链表的中点。
恋喵大鲤鱼
2024/01/20
1310
排序链表(LeetCode 148)
链表奇偶位元素排序的问题
https://cloud.tencent.com/developer/article/2304343
疯狂的KK
2023/07/24
2360
链表奇偶位元素排序的问题
双指针+归并排序!图解排序链表!
给你链表的头结点head ,请将其按 升序 排列并返回 排序后的链表 。要求时间复杂度是O(n log n)
捡田螺的小男孩
2021/12/01
3940
双指针+归并排序!图解排序链表!
单链表排序java_快速排序链表
链表的排序相对数组的排序更为复杂些,也是考察求职者是否真正理解了排序算法(而不是“死记硬背”)
全栈程序员站长
2022/11/07
7000
链表、DFS-LeetCode 216、213、148、202(链表归并排序,组合数问题)
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
算法工程师之路
2019/11/14
5350
java链表排序方法_java链表排序
对链表进行插入排序,是最简单的一种链表排序算法,用于插入排序是迭代的,所以每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。重复直到所有输入数据插入完为止。 插入排序的时间复杂度为O(N^2),空间复杂度为O(1)
全栈程序员站长
2022/11/07
1K0
LeetCode链表知识点&题型总结
刚开始准备刷算法题目的时候,感觉真的是好难,十道题目有九道是不会的。心中曾一万只草泥马跑过,自己怎么这么辣鸡。
程序员徐公
2020/08/04
1.7K0
LeetCode链表知识点&题型总结
单链表的冒泡,快排,选择,插入,归并5种排序算法详解(多图+代码实现)
上节介绍了链表的基本操作史上最全单链表的增删改查反转等操作汇总以及5种排序算法(C语言)
嵌入式与Linux那些事
2021/05/20
12.2K0
单链表的冒泡,快排,选择,插入,归并5种排序算法详解(多图+代码实现)
相关推荐
算法笔记学习-链表
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验