【双指针】面试题 02.07. 链表相交

面试题 02.07. 链表相交

解题思路

  • 首先找到两个链表相同长度的部分
  • 因为两个链表拥有共同的部分 那么共同的部分一定是从等长度的位置开始的
  • 然后依次开始比较节点的地址值
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    
    
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    
    
        // 双指针  指针分别指向两个两个链表开头
        // 不是比较数值相等  比较的是指针是否相等

        // 因为两个链表拥有共同的部分 那么共同的部分一定是从等长度的位置开始的
        ListNode curA = headA;
        ListNode curB = headB;
        int lenA = 0;
        int lenB = 0;


        // 计算链表A 的长度
        while(curA != null){
    
    
            lenA++;
            curA = curA.next;
        }

        // 计算链表B的长度
        while(curB != null){
    
    
            lenB++;
            curB = curB.next;
        }

        curA = headA;
        curB = headB;

        if(lenA < lenB){
    
    
            int gap = lenB - lenA;// 求出长度差

            // 让curA和curB在同一个起点
            while(gap-- > 0){
    
    
                curB = curB.next;// 移动curB 使得两个指针指向相同的位置
            }
            // 然后同时遍历curA 和curB  比较指针
            while(curA != null){
    
    
                if(curA == curB){
    
    
                    return curA;
                }
                curA = curA.next;
                curB = curB.next;
            }

        }else{
    
    
            int g = lenA - lenB;
            while(g-- > 0){
    
    
                curA = curA.next;
            }

            while(curA != null){
    
    
                if(curA == curB){
    
    
                    return curA;
                }
                curA = curA.next;
                curB = curB.next;
            }
        }
        return null;
        
    }
}

猜你喜欢

转载自blog.csdn.net/qq_44653420/article/details/131709682
今日推荐