編寫一個程序,找到兩個單鏈表相交的起始節點。
例如,下面的兩個鏈表:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
在節點 c1 開始相交。
注意:
如果兩個鏈表沒有交點,返回 null.
在返回結果後,兩個鏈表仍須保持原有的結構。
可假定整個鏈表結構中沒有循環。
程序儘量滿足 O(n) 時間複雜度,且僅用 O(1) 內存。
解題思路:將兩個鏈表右對齊,分別計算兩個鏈表的長度,然後刪除較長鏈表的前端結點,然後開始依次比較兩個鏈表的結點是否相等,有則返回該結點,沒有則返回NULL。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(!headA || !headB) return NULL;
int Alen=0;
int Blen=0;
ListNode* A_first = headA;
ListNode* B_first = headB;
while(A_first){
A_first=A_first->next;
Alen++;
}
while(B_first){
B_first=B_first->next;
Blen++;
}
if(Alen>Blen){
for(int i=0;i<(Alen-Blen);++i)
headA=headA->next;
}
if(Alen<Blen){
for(int j=0;j<(Blen-Alen);++j)
headB=headB->next;
}
while(headA){
if(headA==headB) return headA;
headA=headA->next;
headB=headB->next;
}
return NULL;
}
};