タイトル説明:
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つのリンクリストの最後までです。したがって、重要なのは短いリンクリストです。
- したがって、最初のステップは、2つのリンクリストの長さaとbを計算し、次に長いリンクリストをabだけ戻すことです。
- 次に、2つのリンクリストを順番に後方に移動し、それらを比較します。同じものに遭遇した場合は、ループから飛び出します。
- リンクリストが空であるかどうかを任意に判断します。空の場合は、交差するノードがないことを意味し、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;
}
};