1.問題解決のためのイタリア語
リストのうちの2つを解決するフォーカス、これは、等しい値の交点の焦点ではなく、データの後に必要な交差点は完全に同じです。
Javaレベルを実現するには、同じオブジェクトがあることができるであるオブジェクトの交点です。
PS:私は最初に主題を理解して、ノードの値を比較し始めていなかった、なぜ知って失敗するまで実行例等しいです。
2.通用解法
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA!=null && headB!=null){
ListNode tempA=headA;
ListNode tempB=headB;
while(tempA!=null){
while(tempB!=null){
if(tempA==tempB){
return tempA;
}
tempB=tempB.next;
}
tempB=headB;
tempA=tempA.next;
}
}
return null;
}
ノードは思考の私たちの通常の方法で同じオブジェクトに戻るのであればここでは、2サイクルの方法により、各ノードを通ってきます。
次の結果が顔を打つ:時間複雑|宇宙複雑溶液5%未満です。
ねえ、または問題のタイトルを読み取り、要求時間複雑性の対象は、O(N)であり、空間的複雑さはO(1)であり、それはよりよい解決策であるべきです。
3.より良いソリューション
まず、交点の存在を前提とし、鎖長がCであり、後に交差点は、チェーンが交差点前の長さである、交差点Bの前にリストの長さがBであり、
Bは、B + Cである長さ、長さAは、+ Cであります
我々は、2つの辺が等しいさせた場合、その長さは+ B + Cとなる、最後のリンクリストノードAが前交差点リストBのノードである、すなわち、次のノードが交差点である; Bのリストと同じ方法で、最後のノードノードは、交差点の点です。
このように、我々はあなたが交差点を見つけることができ、一度だけ通過することができ、最大長+ B + C + 1、あなたが交差点を見つけることができます。
コードは以下の通りであります:
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode l1 = headA, l2 = headB;
while (l1 != l2) {
l1 = (l1 == null) ? headB : l1.next;
l2 = (l2 == null) ? headA : l2.next;
}
return l1;
}
参考:https://cyc2018.github.io/CS-Notes/#/notes/Leetcode%20%E9%A2%98%E8%A7%A3%20-%20%E9%93%BE%E8%A1 %A8