Swordはオファーシリーズを指しますSwordはオファー52を指します:2つのリンクリストの最初の共通ノード

タイトル説明:

2つのリンクリストを入力し、それらの最初の共通ノードを見つけます。

次の2つのリンクリストなど。

交差点はノードc1から始まります。

 

例1:

入力:intersectVal = 8、listA = [4,1,8,4,5]、listB = [5,0,1,8,4,5]、skipA = 2、skipB = 3
出力:ノードの参照値= 8
入力の説明:交差ノードの値は8です(2つのリストが交差する場合、0にすることはできないことに注意してください)。それぞれのヘッダーから数えると、リンクリストAは[4,1,8,4,5]であり、リンクリストBは[5,0,1,8,4,5]です。Aでは、交差するノードの前に2つのノードがあり、Bでは、交差するノードの前に3つのノードがあります。
 

例2:

入力:intersectVal = 2、listA = [0,9,1,2,4]、listB = [3,2,4]、skipA = 3、skipB = 1
出力:値= 2のノードの参照
入力の説明:交差ノードの値は2です(2つのリストが交差する場合、0にすることはできないことに注意してください)。それぞれのヘッダーから開始して、リンクリストAは[0,9,1,2,4]であり、リンクリストBは[3,2,4]です。Aでは、交差するノードの前に3つのノードがあり、Bでは、交差するノードの前に1つのノードがあります。
 

例3:

入力:intersectVal = 0、listA = [2,6,4]、listB = [1,5]、skipA = 3、skipB = 2
出力:null
入力の説明:それぞれのヘッダーから数えて、リンクリストAは[2、 6,4]、リンクリストBは[1,5]です。これらの2つのリンクリストは交差しないため、intersectValは0である必要があり、skipAとskipBは任意の値にすることができます。
説明:2つのリンクリストが交差していないため、nullが返されます。

回答:

2つは単一リンクリストであるため、共通ノードが表示された後、次の値はすべて同じであり、2つのリンクリストの最後までです。したがって、重要なのは短いリンクリストです。

  1. したがって、最初のステップは、2つのリンクリストの長さaとbを計算し、次に長いリンクリストをabだけ戻すことです。
  2. 次に、2つのリンクリストを順番に後方に移動し、それらを比較します。同じものに遭遇した場合は、ループから飛び出します。
  3. リンクリストが空であるかどうかを任意に判断します。空の場合は、交差するノードがないことを意味し、NULLを返します。それ以外の場合は、ノードを直接返します。

コード:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    int countlen(ListNode *head)
    {
        int a=0;
        auto headx = head;
        while(headx)
        {
            a++;
            headx = headx->next;
        }
        return a;
    }
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
           int lenA = countlen(headA);
           int lenB = countlen(headB);
           if(lenA>lenB)
           {
               for(int i=0;i<lenA-lenB;i++)
               {
                   headA = headA->next;
               }
           }
           else
           {
               for(int i=0;i<lenB-lenA;i++)
               {
                   headB = headB->next;
               }
           }
           while(headA!=headB)
           {
               headA = headA->next;
               headB = headB->next;
           }
           if(headA) return headA;
           else return NULL;
        return 0;
    }
};

 

おすすめ

転載: blog.csdn.net/qq_46423166/article/details/110790884