建立两个指针 pApA 和 pBpB,分别初始化为链表 A 和 B 的头结点。而后让它们向后逐结点遍历。
当 pA 到达链表的尾部时,将它重定位到链表 B 的头结点,相似的,当 pB 到达链表的尾部时,将它重定位到链表 A 的头结点。
若在某一时刻 pA 和 pB 相遇,则 pA/pB 为相交结点。(本人使用的此解法)node
public static ListNode getIntersectionNode1(ListNode headA, ListNode headB) { if (headA == null || headB == null) { return null; } ListNode pA = headA, pB = headB; while (pA != pB) { pA = pA == null ? headB : pA.next; pB = pB == null ? headA : pB.next; } return pA; }
4.先统计两个链表的长度,先统计两个链表的长度,若是两个链表的长度不同,就让链表长的先走,直到两个链表长度同样,这个时候两个链表再同时每次日后移一步,看节点是否同样,若是有相等的,说明这个相等的节点就是两链表的交点,不然若是走完了尚未找到相等的节点,说明他们没有交点,直接返回null便可指针
public ListNode getIntersectionNode(ListNode headA, ListNode headB) { int lenA = length(headA), lenB = length(headB); while (lenA != lenB) { if (lenA > lenB) { headA = headA.next; lenA--; } else { headB = headB.next; lenB--; } } while (headA != headB) { headA = headA.next; headB = headB.next; } return headA; } //统计链表的长度 private int length(ListNode node) { int length = 0; while (node != null) { node = node.next; length++; } return length; }