一、题目
输入两个链表,找出它们的第一个公共节点。
二、实现
对于A和B两个链表(长度分别为lenA和lenB,公共长度为lenAB),a和b分别指向链表A和B的第一个结点
a先遍历链表A,然后再遍历链表B,直到与b相遇 (遍历的长度:A的长度lenA + 与b相遇前已遍历的链表B的长度lenB-lenAB)
b先遍历链表B,然后再遍历链表A,直到与a相遇 (遍历的长度:B的长度lenB + 与a相遇前已遍历的链表A的长度lenA-lenAB)
即a和b都遍历了链表A和B的结点
a和b相遇的位置即为公共结点的位置
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode a = headA;
ListNode b = headB;
while(a!=b){// a和b相遇的位置即为公共结点
if(a!=null){// 1. a先遍历链表A,再遍历链表B
a = a.next;
}else{
a = headB;
}
if(b!=null){// 2. b先遍历链表B,再遍历链表A
b = b.next;
}else{
b = headA;
}
}
return a;
}
}