[LeetCode]求两个链表的焦点--Intersection of Two Linked Lists

Posted paxing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode]求两个链表的焦点--Intersection of Two Linked Lists相关的知识,希望对你有一定的参考价值。

标题题目地址

1.解题意

求解两个链表的焦点,这个交点并不是焦点的值相等,而是需要交点之后的数据是完全相等的。
落实到java层面,就是交点处的对象是同一个对象即可。

ps:我最开始没有读懂题目,然后就开始比较节点的值是否相等,直到示例跑失败了才知道原因。

2.通用解法

    public ListNode getIntersectionNode(ListNode headA, ListNode headB) 
        if(headA!=null && headB!=null)
            ListNode tempA=headA;
            ListNode tempB=headB;
            while(tempA!=null)
                while(tempB!=null)
                    if(tempA==tempB)
                        return tempA;
                        
                    tempB=tempB.next;
                
                tempB=headB;
                tempA=tempA.next;
            
        
        return null;      
    

这里通过双循环的方式来遍历每一个节点,如果节点是同一个对象即可返回,这是我们正常的思维。
接下来的结果就打脸了:时间复杂度|空间复杂度 超过5%的解法。
哎,还是读题的问题,题目要求了时间复杂度是 O(n),空间复杂度是O(1);那么应该是有更优解的。

3.更优解

首先,假定存在交点,交点之后的链表长度是 c,链表A在交点之前的长度是a,链表B在交点之前的长度是b;
A的长度是 a+c;B的长度是 b+c

如果我们让两边相等,即把长度变成是 a+b+c,那么链表A的最后一个节点是链表B交点之前的节点,即下一个节点就是交点;同理链表B的最后一个节点的下一个节点就是交点;

这样,我们可以只遍历一次,就可以找到交点,最大的长度是 a+b+c+1,即可找到交点;

代码如下:

public ListNode getIntersectionNode(ListNode headA, ListNode headB) 
    ListNode l1 = headA, l2 = headB;
    while (l1 != l2) 
        l1 = (l1 == null) ? headB : l1.next;
        l2 = (l2 == null) ? headA : l2.next;
    
    return l1;

参考:https://cyc2018.github.io/CS-Notes/#/notes/Leetcode%20%E9%A2%98%E8%A7%A3%20-%20%E9%93%BE%E8%A1%A8

以上是关于[LeetCode]求两个链表的焦点--Intersection of Two Linked Lists的主要内容,如果未能解决你的问题,请参考以下文章

leetcode-两个链表的第一个公共节点-47

Leetcode—— 两个链表的第一个公共节点

链表:判断链表是否带环 求两个链表的相交结点

两个链表的第一个公共节点——LeetCode

leetcode简单链表题技巧总结

[LeetCode]剑指 Offer 52. 两个链表的第一个公共节点