題目:
輸入兩個鏈表,找出它們的第一個公共節點。
如下面的兩個鏈表:
在節點 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大佬方案,帶簡單數學原理的。