前言
要判断两个链表是否相交,可以使用双指针法。假设链表A的长度为m,链表B的长度为n,首先遍历链表A和链表B,分别得到它们的长度。然后,让较长的链表的指针先移动|m - n|步,使得两个链表剩下的长度相等。接着,同时遍历两个链表,直到找到相交的节点,或者遍历到链表的末尾。
实现原理
- 首先,遍历两个链表,分别计算它们的长度。
- 然后,让指针从两个链表的头部开始移动,使得两个链表的长度相等。这样,它们将在某一点相遇,或者都同时达到链表的末尾。
- 如果两个链表相交,则它们的末尾节点将是同一个节点。如果它们不相交,则末尾节点将不同。
- 因此,我们可以遍历两个链表的末尾节点来比较它们是否相同,以判断链表是否相交。
具体代码实现
public class ListNode {int val;ListNode next;ListNode(int x) {val = x;next = null;}
}public class IntersectionOfTwoLinkedLists {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {if (headA == null || headB == null)return null;int lenA = getLength(headA);int lenB = getLength(headB);while (lenA > lenB) {headA = headA.next;lenA--;}while (lenB > lenA) {headB = headB.next;lenB--;}while (headA != headB) {headA = headA.next;headB = headB.next;}return headA;}private int getLength(ListNode head) {int length = 0;while (head != null) {length++;head = head.next;}return length;}
}
QA:待定