代码随想录训练营Day4 | 交换链表 + 链表里的双指针法

先注声明:解题思路:借鉴、归纳及总结     意在记录学习过程(非原创)

                  但文字部分及所用图片均来自个人        谢绝转载


1.交换链表    LeetCode 24     24. 两两交换链表中的节点 - 力扣(Leetcode)

   迭代法:

 递归法:

联想: 虽然记叙了两种解法,但本质上只是一种。并且在这道题里,递归并不比迭代高明多少。

           记叙两个版本的代码,或许也只是想说明一件事:迭代和递归本来就是一致的

           或许迭代是一种正向思考,从起点开始;而递归往往是反向思维,从终点开始。

           但无论是哪一种,初态,末态以及循环间的一次操作都是需要思考清楚的。

2.链表里的双指针法

   阐释: 由于单向链表里查找元素只能从头往后顺,并且操作某个结点时必须已知前鉴结点。

               所以两个以上的指针操作是常见的。比较普遍的是pre、cur、temp的表示。

               当然双指针法也不是表面的意义——指包含两个指针所有操作。

               更多情况下,它可能作为一种降低时间复杂度的工具。

               特在此记叙链表里较为经典的几种双指针应用,希望常温常新。

典例1:LeetCode 19  19. 删除链表的倒数第 N 个结点 - 力扣(Leetcode)

   标签:等间距移动

典例2: LeetCode 142  142. 环形链表 II - 力扣(Leetcode)

    标签:判断链表是否有环 + 确定环的入口

备注:用快慢指针判断是否有环是比较常规的,但是用数学计算环入口确实没想到。

           不过与其说是数学问题,不如说是物理问题。

           预设fast速度为2,slow速度为1,则 fast 和slow 的相对速度恰与slow的绝对速度相同。

           而fast和slow又同时出发,这说明二者的相对位移和slow的绝对位移相等。

           因此减去公共部分,可以推算出相遇点和初始点距环入口处的距离相等

           wow, 真是绝妙的结论。

典例3: LeetCode 面试题02.07  面试题 02.07. 链表相交 - 力扣(Leetcode)

              LeetCode 160 160. 相交链表 - 力扣(Leetcode)

    标签:消除长度差后的同步比较

暴力破解:(复杂度较高)

双指针法1:(时间复杂度:O(n + m))

  思路:相交的公共部分不会造成长度差,且产生在(相对位置的)中后段,

             所以可以砍掉较长的链表头部,即长链表的指针先行差值,

             当两条链表长度相同时再逐次比较。

 双指针法2:(时间复杂度:O(n + m))

 备注:这是比较 “浪漫” 的解法:通过互走链表来消除长度差,但是确实很难想到。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值