题目:
输入两个链表,找出它们的第一个公共节点。
如下面的两个链表:
在节点 c1 开始相交。
思路1:
将链表按尾端来对齐,从前向后遍历找到第一个公共节点。
具体实现:计算出两个链表的长度,分别为lenA,lenB。哪个长就将哪个链表向后遍历|lenA-lenB|的长度,然后两个链表同时向后遍历找到第一个公共节点。
代码:
/**
* 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 pA = headA;
int lenA = 0;
while(pA!=null){
pA = pA.next;
lenA++;
}
ListNode pB = headB;
int lenB = 0;
while(pB!=null){
pB = pB.next;
lenB++;
}
pA = headA;
pB = headB;
while(lenA>lenB){
pA = pA.next;
lenA--;
}
while(lenB>lenA){
pB = pB.next;
lenB--;
}
while(pA!=null){
if(pA==pB){
return pA;
}
pA = pA.next;
pB = pB.next;
}
return null;
}
}
思路2:
参考leetcode大佬方案,带简单数学原理的。