//默认l是头节点值较小的链表
func merge(l, r *ListNode) *ListNode{
tmp := l
for tmp.Next != nil && r != nil{
tmpN := r.Next
if tmp.Val <= r.Val && tmp.Next.Val > r.Val{
r.Next = tmp.Next
tmp.Next = r
r = tmpN
}else{
tmp = tmp.Next
}
}
if tmp.Next == nil{
tmp.Next = r
}
return l
}
func reverse(head *ListNode) *ListNode{
if head == nil{
return head
}
pre := head.Next
head.Next = nil
for pre != nil{
tmp := pre.Next
pre.Next = head
head = pre
pre = tmp
}
return head
}
func findLower(nums []int, target int) int {
l, r := 0, len(nums)-1
if nums[l] > target {
return -1
}
for l <= r {
mid := (r-l)/2 + l
if nums[mid] < target {
l = mid + 1
} else {
r = mid - 1
}
}
// 判断一下 nums[left] 是不是 target
if l >= 0 && l < len(nums) && nums[l] == target {
return l
}
// 如果没有找到,就返回第一个小于 target 的位置,如果不需要返回第一个小于 target 的位置,那就返回-1
return r
}
func findUpper(nums []int, target int) int {
l, r := 0, len(nums)-1
if nums[r] < target {
return -1
}
for l <= r {
mid := (r-l)/2 + l
if nums[mid] > target {
r = mid - 1
} else {
l = mid + 1
}
}
if r >= 0 && r < len(nums) && nums[r] == target {
return r
}
//如果没有找到,就返回第一个大于 target 的位置,如果不需要返回第一个小于 target 的位置,那就返回-1
return l
}
func quickMul(x float64, N int) float64 {
ans := 1.0
// 贡献的初始值为 x
x_contribute := x
// 在对 N 进行二进制拆分的同时计算答案
for N > 0 {
if N & 1 == 1 {
// 如果 N 二进制表示的最低位为 1,那么需要计入贡献
ans *= x_contribute
}
// 将贡献不断地平方
x_contribute *= x_contribute
// 舍弃 N 二进制表示的最低位,这样我们每次只要判断最低位即可
N = N >> 1
}
return ans
}
https://www.nowcoder.com/practice/f23604257af94d939848729b1a5cda08?tpId=295&tqId=1008897&ru=/exam/oj&qru=/ta/format-top101/question-ranking&sourceUrl=%2Fexam%2Foj
注意fast是head.Next,正常应该fast,slow都是head