160. 相交链表
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。
如果两个链表不存在相交节点,返回 null 。
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
题解一:
两条链表拼接 (逻辑相连),然后同时走,即可找到相交节点。
java
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
// 双指针
ListNode pa = headA;
ListNode pb = headB;
while (pa != pb) {
// pa 走一步,如果走到根节点,转到 headB 节点
if (pa == null) {
pa = headB;
} else {
pa = pa.next;
}
// pb 走一步,如果走到根节点,转到 headA 节点
if (pb == null) {
pb = headA;
} else {
pb = pb.next;
}
}
return pa;
}
题解二:
1.找到较长 的链表max
2.max走(max-min)步
3.max min同时走,相遇即是交点
java
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
// 得到链表长度
int lenA = getLen(headA);
int lenB = getLen(headB);
ListNode min = new ListNode(-1);
ListNode max = new ListNode(-1);
// 找到较长的链表max
if (lenA > lenB) {
max = headA;
min = headB;
} else {
max = headB;
min = headA;
}
// 链表max 先走 gap 步
int gap = Math.abs(lenA - lenB);
while (gap > 0) {
max = max.next;
gap--;
}
// max min同时走,相遇即是交点
while (max != min) {
max = max.next;
min = min.next;
}
return max;
}
public int getLen(ListNode node) {
int len = 0;
while (node != null) {
len++;
node = node.next;
}
return len;
}