160. Intersection of Two Linked Lists
Write a program to find the node at which the intersection of two singly linked lists begins.
For example, the following two linked lists:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
begin to intersect at node c1.
Notes:
- If the two linked lists have no intersection at all, return
null
. - The linked lists must retain their original structure after the function returns.
- You may assume there are no cycles anywhere in the entire linked structure.
- Your code should preferably run in O(n) time and use only O(1) memory.
查找两个链表的第一个公共节点,如果两个节点的尾节点相同,肯定存在公共节点
方法: 长的链表开始多走 (h1的数量 - h2的数量)步,然后和短链表同步往下走,遇到的第一个相同的节点就是最早的公共节点
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null)
return null;
ListNode h1 = headA;
ListNode h2 = headB;
// lenA为A链表的长度,初始值为1
int lenA = 1;
int lenB = 1;
while (h1.next != null) {
lenA++;
h1 = h1.next;
}
while (h2.next != null) {
lenB++;
h2 = h2.next;
}
// 若A与B尾结点不同,则肯定没有相交。
if (h1 != h2)
return null;
else {
int count = Math.abs(lenA - lenB);
//h1指向链表长的头结点。
if (lenA >= lenB) {
h1 = headA;
h2 = headB;
} else {
h1 = headB;
h2 = headA;
}
for(int i=0;i<count;i++)
h1=h1.next;
while(h1 != null&&h2 != null && h1 != h2){
h1 = h1.next;
h2 = h2.next;
}
}
//若没有交点,则h1 为null
return h1;
}