109. Convert Sorted List to Binary Search Tree
Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
---
需要总长度,遍历一遍,
1. 可以再这个时候吧list转成array, 费地方
2. 或者跟array一样每次走半个长度找到mid, O(NlogN), logN层,每层遍历N,费时间
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; next = null; } * } */ /** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public TreeNode sortedListToBST(ListNode head) { // traverse the get the length ListNode node = head; int len = 0; while(node != null){ node = node.next; len++; } return helper(head, 0, len-1); } private TreeNode helper(ListNode node, int l, int r){ if(l>r) return null; int mid = l + (r-l)/2; // find the mid int i=0; ListNode run = node; while(i<mid){ run = run.next; i++; } TreeNode cur = new TreeNode(run.val); cur.left = helper(node, l, mid-1); cur.right = helper(node, mid+1, r); return cur; } }
3. bottem up, 先从left child-》cur -> right, 按list node 插入,
但是注意object passed by reference, 本层node = node.next,但是上一层的node还是没变
所以用node.val = node.next val, node.next = node.next.next直接改变reference所指的node的值
O(N)
---
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; next = null; } * } */ /** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public TreeNode sortedListToBST(ListNode head) { // traverse the get the length ListNode node = head; int len = 0; while(node != null){ node = node.next; len++; } return helper(head, 0, len-1); } private TreeNode helper(ListNode node, int l, int r){ if(l>r) return null; int mid = l + (r-l)/2; // left first TreeNode left = helper(node, l, mid-1); TreeNode cur = new TreeNode(node.val); cur.left = left; // java pass object by reference, // even if i call node = node.next; // the node the other recursive call dosn't change // so move the node by : if(node.next != null){ node.val = node.next.val; node.next = node.next.next; } cur.right = helper(node, mid+1, r); return cur; } }
浙公网安备 33010602011771号