一些ms小算法

1.如何判断两个无环单链表有没有交叉点

解:
    如果有交点,那就是交点后的数据一致,那就是呈现y型
    取两者的短链为参考链,快进到一样长度(初始指针不动,等待len1-len2后再动),如果ptra = ptrb就是有共同节点(排除nil)

2.如何判断一个单链表有没有环, 并找出入环点

解:
    三指针,ptr1以一格一跳;ptr2以两格一跳,
    如果有环,必定在ptr1跑完所有节点前和ptr2相遇,
    如果有相遇,这时ptr3指向链表头,同时移动ptr1和ptr3,相遇点即为入环点
	时间复杂On;空间O1

3.快排

package main

import (
	"fmt"
)

func quicksort_1(arry []int, start, end int, f func(int, int)(bool)){
	if start < end {
		hartpart := (start + end) / 2
		a,b,s := start, end, arry[hartpart]
		for a < b{
			for f(arry[a], s) { a++ }
			for f(s, arry[b]) { b-- }
			arry[a], arry[b] = arry[b], arry[a]
			a++
			b--
		}
		if start < b{ quicksort_1(arry, start, b, f)}
		if a < end{ quicksort_1(arry, a, end, f) }
	}
}

func main(){
	var arry = []int{19,8,16,15,23,34,6,0,1,0,2,9,7}
	quicksort_1(arry,0,len(arry) -1,func(a,b int)bool{return a > b})
	fmt.Print(arry)
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值