1.需要
-
単一リンクリストが与えられると、その中の要素は昇順でソートされ、高度にバランスの取れた二分探索木に変換されます。
-
この質問では、高度にバランスの取れた二分木は、二分木の各ノードの左右のサブツリー間の高さの差の絶対値が1を超えないことを意味します。
第二に、スピードポインター
2.1思考分析
- 順序付きリンクリストの場合、中央の要素を検索する場合は、高速ポインタと低速ポインタを使用する必要があります。高速ポインタが低速ポインタよりも1スペース多く移動するたびに、高速ポインタがnullまたは次の要素を指している場合高速ポインタのがnullを指している場合、低速です。ポインタは中央の要素を指します。
- 手順1を除いて、基本的な考え方は「順序付けられた配列を二分探索木に変換する」と同じです。
2.2コードの実装
class Solution {
public TreeNode sortedListToBST(ListNode head) {
if(head == null) return null;
return helper(head, null);
}
//符合左闭右开
public TreeNode helper(ListNode head, ListNode tail) {
if(head == tail) return null;
ListNode fast = head;
ListNode slow = head;
while(fast != tail && fast.next != tail) {
fast = fast.next.next;
slow = slow.next;
}
TreeNode root = new TreeNode(slow.val);
root.left = helper(head, slow);
root.right = helper(slow.next, tail);
return root;
}
}
2.3複雑さの分析
- 時間計算量はO(N)であり、二分探索木の確立には、すべてのリンクリストノードの走査が必要です。
- スペースの複雑さは;