109.将有序链表转换为二叉搜索树
给定一个单链表的头节点 head
,其中的元素 按升序排序 ,将其转换为 平衡二叉搜索树。
示例 1:
1 2 3
| 输入: head = [-10,-3,0,5,9] 输出: [0,-3,9,-10,null,5] 解释: 一个可能的答案是[0,-3,9,-10,null,5],它表示所示的高度平衡的二叉搜索树。
|
和108一样,区别就是在于如何找到链表的中间节点罢了,用之前的快慢指针法即可,这里的左右边界直接是头节点和null,因为是左闭右开的区间
Solution
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| class Solution { public TreeNode sortedListToBST(ListNode head) { return buildTree(head, null); }
public TreeNode buildTree(ListNode left, ListNode right) { if (left == right) { return null; } ListNode mid = getMedian(left, right); TreeNode root = new TreeNode(mid.val); root.left = buildTree(left, mid); root.right = buildTree(mid.next, right); return root; }
public ListNode getMedian(ListNode left, ListNode right) { ListNode fast = left; ListNode slow = left; while (fast != right && fast.next != right) { fast = fast.next.next; slow = slow.next; } return slow; } }
|