算法篇:链表之排序
时间:2022-07-22
本文章向大家介绍算法篇:链表之排序,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
算法:
对于链表的排序,一般要设计到拆分合并两步,拆分这一步:
中间节点作为临界值,小的放左边,大的放右边
合并操作步骤:
将两个有序的链表中,串联起来
题目1:分隔链表
https://leetcode-cn.com/problems/partition-list/submissions/
代码实现:
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func partition(head *ListNode, x int) *ListNode {
if head == nil {
return nil
}
curr := head
before := new(ListNode)
before1 := before
after := new(ListNode)
after1 := after
for curr != nil {
if curr.Val < x {
before.Next = curr
before = before.Next
} else {
after.Next = curr
after= after.Next
}
curr = curr.Next
}
before.Next = nil
after.Next = nil
if after1.Next != nil {
before.Next = after1.Next // after1记录偏移之前的after首节点位置
}
return before1.Next // 原因是before1首节点是一个none的节点。
}
/* 解法:
这个可以拆分成,两个链表,小于x的放到before,大于等于的放到after.
然后将这两个链表拼接起来。
*/
执行结果:
题目2: https://leetcode-cn.com/problems/partition-list-lcci/submissions/
代码实现:
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func partition(head *ListNode, x int) *ListNode {
l1, l2 := new(ListNode),new(ListNode)
res,res1 := l1,l2
for head != nil {
if head.Val < x {
l1.Next = &ListNode{Val:head.Val}
l1 = l1.Next
} else {
l2.Next = &ListNode{Val:head.Val}
l2 = l2.Next
}
head = head.Next
}
l1.Next = res1.Next
return res.Next
}
// 双指针排序,小于x的放到l1,大于x的放在l2; 最后将两个链表串起来
执行结果:
题目3:排序链表
https://leetcode-cn.com/problems/sort-list/
代码实现:
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func sortList(head *ListNode) *ListNode {
// 归并写法:1.先拆分,二分法拆分,快慢指针;2.在合并,双指针的方式
if head == nil || head.Next == nil {
return head
}
// 快慢指针找到对应的中间位置节点
s,f := head,head.Next // 两个指针不要指向同一个节点
for f != nil && f.Next != nil {
s = s.Next
f = f.Next.Next
}
tmp := s.Next
s.Next = nil
// 递归操作左右链表
l := sortList(head)
r := sortList(tmp)
pre := new(ListNode)
res := pre
// 合并左右链表
for l != nil && r != nil {
if l.Val < r.Val {
pre.Next = l
l = l.Next
} else {
pre.Next = r
r = r.Next
}
pre = pre.Next
}
if l != nil {
pre.Next = l
} else if r != nil {
pre.Next = r
}
return res.Next
}
执行结果:
- Edgware.RC1中ZuulFallbackProvider的改进
- JPA的多表复杂查询:详细篇
- 尝试使用Memcached遇到的狗血问题
- Enumerable#Zip 实现一下
- 更新自己,不要影响其他人
- 【译】Spring官方教程:Spring Boot整合消息中间件RabbitMQ
- [实录]解决Migrator.Net 小bug
- Jenkins Pipeline插件十大最佳实践!
- Spring Cloud Hystrix的请求合并
- JQuery JCshare 0.1 分享插件
- Java中的即时编译(Just-in-time compilation)
- 无尽的忙碌换来幸福的日子
- 消费者驱动的微服务契约测试套件:Spring Cloud Contract
- 自己做的一个小程序 可采集、导出、模板、配置
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 挖洞经验 | Google Play Core Library中的代码执行漏洞
- 设计模式-七大原则(图解一目了然)
- 公平组合游戏-巴什游戏、尼姆游戏和SG函数
- 数据库应用技术系列第一讲 创建数据库和表
- 怎样让数据库再快一点?
- 大数据场景下,如何快速将Linux 大文件处理小
- Mysql系列第十六讲 变量详解
- Mysql系列第十七讲 流程控制语句(高手进阶)
- 私藏的5个好用的Pandas函数!
- 漫画:如何在数组中找到和为 “特定值” 的两个数?
- 当你在百度搜索关键字的时候,哪个网站会排在最前面?今天给大家科普一下“网站SEO”
- Mysql系列第十九讲 异常捕获及处理详解
- 【原创】经验分享:一个小小emoji尽然牵扯出来这么多东西?
- jQuery 事件对象,拷贝对象,多库共存
- jQuery 事件注册与事件处理