【数据结构】链表 | 链表相交

92 阅读1分钟

题目面试题 02.07. 链表相交 - 力扣(LeetCode)

image.png

思路

  1. cura和curb指针遍历A、B链表
  2. 对齐cura和curb指针
  3. cura和curb同时遍历,若遇到cura和curb相等,则链表相交,返回该节点
graph TD
cura\curb --> 对齐cura和curb --> cura和curb同时遍历 --> cura等于curb --> 返回cura

代码

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode cura = headA;
        ListNode curb = headB;
        if(cura == null || curb == null) {
            return null;
        }
        // 求出链表长度差
        int lena = 0;
        int lenb = 0;
        while(cura != null) {
            cura = cura.next;
            lena++;
        }
        while(curb != null) {
            curb = curb.next;
            lenb++;
        }
        // 对齐ab指针位置
        cura = headA;
        curb = headB;
        int delta = Math.abs(lena-lenb);
        if(lena > lenb){
            while(delta > 0){
                cura = cura.next;
                delta--;
            }
        }else if(lena < lenb){
            while(delta > 0){
                curb = curb.next;
                delta--;
            }
        }
        // 从相同位置往后遍历
        while(cura != null) {
            if(cura == curb) {
                return cura;
            }
            cura = cura.next;
            curb = curb.next;
        }
        return null;
    }
}