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

剑指 Offer 52. 两个链表的第一个公共节点
思路:
  1.统计两个链表长度 lenAlenB ,让长度长的链表先走 abs(lenB - lenA) 步,然后两个链表一起向前走,两个结点相等时退出循环
  2.A链表总长度为LA + C,B链表总长度为LB + C,A链表走完后指向B的头结点,再指向headB,走LB长度,此时A走过的总长度为 LA + C + LB,同理, B 走过的总长度为 LB + C +LA此时就会相遇。
注意点:尽量不要改变头结点head

统计长度版本

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode dumA = headA, dumB = headB;
        int lenA = length(dumA), lenB = length(dumB);
        while(lenA != lenB){
            if(lenA > lenB){
                dumA = dumA.next;
                lenA--;
            }else{
                dumB = dumB.next;
                lenB--;
            }
        }
        while(dumA != dumB){
            dumA = dumA.next;
            dumB = dumB.next;
        }
        return dumA;
    }
    public int length(ListNode node){
        int length = 0;
        while(node != null){
            node = node.next;
            length++;
        }
        return length;
    }
}

遍历两个链表的版本
  如果没有相同节点,那这个dumA 和dumB 会把两个链表都遍历完,当遍历完的时候,两个变量都指向null,然后就退出了while循环,返回null

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode dumA = headA, dumB = headB;
        while(dumA != dumB){
            if(dumA != null){
                dumA = dumA.next;
            }else{
                dumA = headB;
            }
            if(dumB != null){
                dumB = dumB.next;
            }else{
                dumB = headA;
            }
        }
        //dumA 要么是空,要么是两链表的交点
        return dumA;
    }
}
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode dumA = headA, dumB = headB;
        while(dumA != dumB){
            dumA = dumA != null ? dumA.next : headB;
            dumB = dumB != null ? dumB.next : headA;
        }
        //dumA 要么是空,要么是两链表的交点
        return dumA;
    }
}
上一篇:[剑指Offer系列] 52 两个链表的第一个公共节点


下一篇:JeecgBoot table 渲染图片