Leetcode(鏈表)相交鏈表(c++)

編寫一個程序,找到兩個單鏈表相交的起始節點。

例如,下面的兩個鏈表:

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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章