Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
首先想到的是先将单链表转化为数组,就可以取中位数为根节点再递归左右子做,时间复杂度O(n),空间复杂度O(n)。
在网上搜了个时间复杂度为O(n),空间复杂度为O(1)的做法,思路如下:
由于二叉排序树的中序遍历即有序,也就是与本题中的单链表从头到尾遍历相同,所以可以按照类似中序遍历的做法,首先,创建当前节点的左子,然后创建当前节点,将该节点的left指针指向之前创建好的左子,然后创建右子,以这样的顺序,每次新创建的节点都对应单链表的顺序遍历中当前位置的节点,因此,用一个全局遍历表示当链表,在递归过程中不断修改当前单链表的指针,使每次创建的节点与单链表头节点对应。代码如下:
1 public ListNode head;
2 public TreeNode sortedListToBST(ListNode head) {
3 this.head = head;
4 ListNode p = head;
5 int len = 0;
6 while (p != null) {
7 p = p.next;
8 len++;
9 }
10 return buildTree(0, len - 1);
11 }
12
13 private TreeNode buildTree(int start, int end) {
14 // TODO Auto-generated method stub
15 if (start > end) {
16 return null;
17 }
18 int mid = start + (end - start) / 2;
19 TreeNode left = buildTree(start, mid - 1);
20 TreeNode root = new TreeNode(head.val);
21 root.left = left;
22 head = head.next;
23 root.right = buildTree(mid + 1, end);
24 return root;
25 }

来源:https://www.cnblogs.com/apoptoxin/p/3766336.html