剑指Offer--52:找寻两个链表的相交节点

描述

img

方法一

/*
    当我们走完各自的路 重新回到对方最初的地方
    如果我们的缘分不是两条平行的线
    那么一定会在第一次有交集的地方重新相遇
 */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if(headA == null || headB == null){
            return null;
        }
        ListNode node1 = headA;
        ListNode node2 = headB;
        
        while(node1 != node2){
            node1 = node1 == null ? headB : node1.next;
            node2 = node2 == null ? headA : node2.next;
        }
        return node1;     
    }
}

方法二

1、先计算出两个链表的长度差
2、让较长的链表现在差值个位置
3、两个链表同时遍历,相等返回,没有相等的节点返回null

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if(headA == null || headB == null){
            return null;
        }
        ListNode node1 = headA;
        ListNode node2 = headB;
        
        int len1 = 0, len2 = 0;
        while(node1 != null){
            len1 ++;
            node1 = node1.next;
        }
        while(node2 != null){
            len2 ++;
            node2 = node2.next;
        }
        node1 = headA;
        node2 = headB;
        // 计算差值
        int cz = 0;
        if(len1 > len2){
            cz = len1 - len2;
            for(int i = 0; i < cz; i++){
                node1 = node1.next;
            }
        }
        if(len1 < len2){
            cz = len2 - len1;
            for(int i = 0; i < cz; i++){
                node2 = node2.next;
            }
        }
        while(node1 != null && node2 != null){
            if(node1 == node2){
                return node1;
            }else{
                node1 = node1.next;
                node2 = node2.next;
            }
        }
        return null;
    }
}
posted on 2021-05-14 11:05  caoshikui  阅读(31)  评论(0)    收藏  举报