golang算法快慢指针

876. 链表的中间结点

给你单链表的头结点 head ,请你找出并返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

示例 1:

输入:head = 1,2,3,4,5

输出:3,4,5

解释:链表只有一个中间结点,值为 3 。

示例 2:

输入:head = 1,2,3,4,5,6

输出:4,5,6

解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。

提示:

链表的结点数范围是 1, 100

1 <= Node.val <= 100

cpp 复制代码
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func middleNode(head *ListNode) *ListNode {
    slow,fast:=head,head
    for fast!=nil&&fast.Next!=nil{
        fast=fast.Next.Next
        slow=slow.Next
    }
    return slow
}

141. 环形链表

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

示例 1:

输入:head = 3,2,0,-4, pos = 1

输出:true

解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入:head = 1,2, pos = 0

输出:true

解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

输入:head = 1, pos = -1

输出:false

解释:链表中没有环。

提示:

链表中节点的数目范围是 0, 104

-105 <= Node.val <= 105

pos 为 -1 或者链表中的一个 有效索引 。

进阶:你能用 O(1)(即,常量)内存解决此问题吗?

c 复制代码
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func hasCycle(head *ListNode) bool {
    fast,slow:=head,head
    for fast!=nil&&fast.Next!=nil{
        fast=fast.Next.Next
        slow=slow.Next
        if slow==fast{
            return true
        }
    }
    return false
}

143. 重排链表

给定一个单链表 L 的头节点 head ,单链表 L 表示为:

L0 → L1 → ... → Ln - 1 → Ln

请将其重新排列后变为:

L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → ...

不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例 1:

输入:head = 1,2,3,4

输出:1,4,2,3

示例 2:

输入:head = 1,2,3,4,5

输出:1,5,2,4,3

提示:

链表的长度范围为 1, 5 \* 104

1 <= node.val <= 1000

cpp 复制代码
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func middleNode(head *ListNode)*ListNode{
    fast,slow:=head,head
    for fast!=nil&&fast.Next!=nil{
        fast=fast.Next.Next
        slow=slow.Next
    }
    return slow
}
func reverse(head *ListNode)*ListNode{
    var pre,cur *ListNode=nil,head
    for cur!=nil{
        tmp:=cur.Next
        cur.Next=pre
        pre=cur
        cur=tmp
    }
    return pre
}
func reorderList(head *ListNode)  {
    mid:=middleNode(head)
    head2:=reverse(mid)
    for head2.Next!=nil{
        nxt:=head.Next
        nxt2:=head2.Next
        head.Next=head2
        head2.Next=nxt
        head=nxt
        head2=nxt2
    }
}

234. 回文链表

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。

示例 1:

输入:head = 1,2,2,1

输出:true

示例 2:

输入:head = 1,2

输出:false

提示:

链表中节点数目在范围1, 105

0 <= Node.val <= 9

进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

cpp 复制代码
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func middleNode(head *ListNode)*ListNode{
    fast,slow:=head,head
    for fast!=nil&&fast.Next!=nil{
        fast=fast.Next.Next
        slow=slow.Next
    }
    return slow
}
func reverse(head *ListNode)*ListNode{
    var pre,cur *ListNode=nil,head
    for cur!=nil{
        tmp:=cur.Next
        cur.Next=pre
        pre=cur
        cur=tmp
    }
    return pre
}
func isPalindrome(head *ListNode) bool {
    mid:=middleNode(head)
    head2:=reverse(mid)
    for head!=nil&&head2!=nil{
        if head.Val!=head2.Val{
            return false
        }
        head=head.Next
        head2=head2.Next
    }
    return true
}   

2130. 链表最大孪生和

在一个大小为 n 且 n 为 偶数 的链表中,对于 0 <= i <= (n / 2) - 1 的 i ,第 i 个节点(下标从 0 开始)的孪生节点为第 (n-1-i) 个节点 。

比方说,n = 4 那么节点 0 是节点 3 的孪生节点,节点 1 是节点 2 的孪生节点。这是长度为 n = 4 的链表中所有的孪生节点。

孪生和 定义为一个节点和它孪生节点两者值之和。

给你一个长度为偶数的链表的头节点 head ,请你返回链表的 最大孪生和 。

示例 1:

输入:head = 5,4,2,1

输出:6

解释:

节点 0 和节点 1 分别是节点 3 和 2 的孪生节点。孪生和都为 6 。

链表中没有其他孪生节点。

所以,链表的最大孪生和是 6 。

示例 2:

输入:head = 4,2,2,3

输出:7

解释:

链表中的孪生节点为:

  • 节点 0 是节点 3 的孪生节点,孪生和为 4 + 3 = 7 。
  • 节点 1 是节点 2 的孪生节点,孪生和为 2 + 2 = 4 。
    所以,最大孪生和为 max(7, 4) = 7 。
    示例 3:

输入:head = 1,100000

输出:100001

解释:

链表中只有一对孪生节点,孪生和为 1 + 100000 = 100001 。

提示:

链表的节点数目是 2, 105 中的 偶数 。

1 <= Node.val <= 105

cpp 复制代码
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func middleNode(head *ListNode)*ListNode{
    fast,slow:=head,head
    for fast!=nil&&fast.Next!=nil{
        fast=fast.Next.Next
        slow=slow.Next
    }
    return slow
}
func reverse(head *ListNode)*ListNode{
    var pre,cur *ListNode=nil,head
    for cur!=nil{
        tmp:=cur.Next
        cur.Next=pre
        pre=cur
        cur=tmp
    }
    return pre
}
func pairSum(head *ListNode) int {
    mid:=middleNode(head)
    head2:=reverse(mid)
    ans:=0
    for head2!=nil{
        ans=max(ans,head2.Val+head.Val)
        head=head.Next
        head2=head2.Next
    }
    return ans
}
相关推荐
一个王同学1 小时前
从零到一 | CV转多模态大模型 | week17 | LLM 推理优化 & vLLM 详解
人工智能·深度学习·算法·机器学习·计算机视觉·vllm
jimy11 小时前
C语言模拟对象、方法:“函数指针+结构体“复用函数指针指向的函数体
c语言·开发语言
天外天-亮2 小时前
HBuilder X 使用 uview-plus 方式
开发语言·javascript·hbuilder x·uview-plus
木木子222 小时前
[特殊字符] 音乐播放器——状态驱动的多媒体控制
android·开发语言·华为·php·harmonyos
旖-旎2 小时前
《LeetCode 53 最大子数组和 || LeetCode 918 环形子数组的最大和》
c++·算法·leetcode·动态规划
变量未定义~2 小时前
单调栈+倍增思想 皇家守卫【算法赛】、单调队列 附近最小
算法
QN1幻化引擎2 小时前
给 AI 做一次「意识体检」——基于 QN1 幻化引擎的灵鉴意识识别框架与 DalinX V5 实测
大数据·数据结构·人工智能·算法·架构
六个九十度2 小时前
用python脚本访问被网关隔离的嵌入式设备
开发语言·python
拂拉氏3 小时前
【知识讲解】 AVL树从基本成员的介绍到核心接口的实现(插入、判断、删除等等)
数据结构·算法·avl树
酷酷的身影3 小时前
Drivers/LedManager.cs
开发语言·php