zoukankan      html  css  js  c++  java
  • LeetCode算法题:链表相交

    题目描述
    给定两个(单向)链表,判定它们是否相交并返回交点。请注意相交的定义基于节点的引用,而不是基于节点的值。换句话说,如果一个链表的第 k 个节点与另一个链表的第 j 个节点是同一节点(引用完全相同),则这两个链表相交。

    输入:listA = [4,2,8,4,5,6], listB = [5,0,1,8,4,5]

    输出:[8,4,5]

    核心思路:
    你变成我,我变成你,我们便相遇了。那么为什么能相遇呢?

    设长链表 A 长度为 LA,短链表长度 LB;由于速度相同,则在长链表 A 走完 LA 长度时,短链表 B 已经反过头在 A 上走了 LA-LB 的长度,剩余要走的长度为 LA-(LA-LB) = LB;

    之后长链表 A 要反过头在 B上走,剩余要走的长度也是 LB;也就是说目前两个链表“对齐”了。因此,接下来遇到的第一个相同节点便是两个链表的交点。

    那如果两个链表不存在交点呢?

    答:这样的话第 4 步就会一直执行到两个链表的末尾,la,lb 都为 null,也会跳出循环,返回null。

    代码如下:

     
    public class ListNode {
    public var val: Int
    public var next: ListNode?
    public init(_ val: Int) {
    self.val = val
    self.next = nil
        }
    }
     
    class Solution {
    func getIntersectionNode(_ headA: ListNode?, _ headB: ListNode?) -> ListNode? {
    var currentA = headA
    var currentB = headB
    //!等价于 同一对象
    while currentA.val != currentB.val {
            currentA = (currentA != nil) ? currentA?.next : headB
            currentB = (currentB != nil) ? currentB?.next : headA
          }
    return currentA
        }
    }

    今天分享的不容易想到,但是很巧妙。自己想,可能一会儿很难想到,所以平时需要多刷刷题。

    欢迎关注【无量测试之道】公众号,回复【领取资源】
    Python编程学习资源干货、
    Python+Appium框架APP的UI自动化、
    Python+Selenium框架Web的UI自动化、
    Python+Unittest框架API自动化、
    资源和代码 免费送啦~
    文章下方有公众号二维码,可直接微信扫一扫关注即可。

    备注:我的个人公众号已正式开通,致力于测试技术的分享,包含:大数据测试、功能测试,测试开发,API接口自动化、测试运维、UI自动化测试等,微信搜索公众号:“无量测试之道”,或扫描下方二维码:

    添加关注,让我们一起共同成长!

  • 相关阅读:
    [转]How do I use variables in Oracle SQL Developer?
    [转]一张图理解prototype、proto和constructor的三角关系
    [转]ASP.NET Web API系列教程(目录)
    [转]解读ASP.NET 5 & MVC6系列(7):依赖注入
    [转]什么?你还不会写JQuery 插件
    [书目20170314]理解未来的7个原则
    java List.subList方法中的超级大陷阱
    MyBatis动态传入表名,字段名参数的解决办法---statementType用法
    lvs+keepalived和haproxy+heartbeat区别
    Nginx/LVS/HAProxy负载均衡软件的优缺点详解
  • 原文地址:https://www.cnblogs.com/Wu13241454771/p/15157504.html
Copyright © 2011-2022 走看看