//方法1,将有序链表的元素全部保存到一个List,就将此问题转化为了108题 //方法2,直接找链表的中心点,(876题),剩下的就和108的思想一样了,本人用方法二解题 class Solution { public TreeNode sortedListToBST(ListNode head) { //边界处理,链表为空时,返回null if(head == null) return null; //只有一个元素,构建的树只有一个根节点 if(head.next == null) return new TreeNode(head.val); //剩下的情况应该找链表的中心点了,这里用快慢指针法,快指针走2步,慢指针走一步, //但需注意的是 链表要从中心点断开,以便遍历左子树,所以需要将中心点的前一个节点的指针指向null ListNode fast = head,low = head; //定义pre指针 保存中心点的前一个节点 ListNode pre = null; while(fast != null && fast.next != null){ pre = low; low = low.next; fast = fast.next.next; } //遍历完链表后,三个节点到了相应的位置,此时断开链表 pre.next = null; //以链表的中心点为根节点构建二叉搜索树 TreeNode root = new TreeNode(low.val); root.left = sortedListToBST(head); root.right = sortedListToBST(low.next); //返回构建的二叉搜索树 return root; } }