剑指 Offer 52. 两个链表的第一个公共节点
作者:互联网
思路:
1.统计两个链表长度 lenA
和 lenB
,让长度长的链表先走 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;
}
}
标签:ListNode,Offer,52,链表,dumB,headB,dumA,next 来源: https://blog.csdn.net/weixin_45367847/article/details/112464210