1. 程式人生 > >每日一題——連結串列相交問題

每日一題——連結串列相交問題

這裡寫圖片描述
1>判斷兩個連結串列是否相交,若相交,求交點(連結串列不帶環)
2>判斷兩個連結串列是否相交,若相交,求交點(連結串列可能帶環)

//連結串列不帶環

ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        // write your code here
        if(headA ==NULL || headB == NULL)
            return NULL;
        int lenA = 0;
        int lenB = 0;
        ListNode* A = headA;
        ListNode* B = headB;
        while
(A) { lenA++; A = A->next; } while(B) { lenB++; B = B->next; } ListNode* curA = headA; ListNode* curB = headB; if(lenA > lenB) { int len = lenA - lenB; while
(len--) { curA = curA->next; } } else if(lenA < lenB) { int len = lenB - lenA; while(len--) { curB = curB->next; } } else {} while(curA->val != curB->val) { curA = curA->next
; curB = curB->next; } return curA; }
帶環連結串列可能相交分為兩種情況:1,一個帶環,一個不帶環;
                          2,兩個都帶環(該環必須共享,才能保證相交)。

解題思路:
1,先判斷兩個連結串列是否帶環;
2,分3種情況
    若一個有環,一個無環,肯定不相交;
    兩個都有環;若要相交,環必須是共享的。即若相交,交叉點肯定在起始點與環入口之間。
    兩個都沒環。(就是第一個問題)

附加題:
輸出了6個‘-’(在Linux上驗證)
第一次fork,共兩個程序,輸出兩個
第二次fork,共四個程序,輸出四個
共6個