leetcode 109. 有序链表转换二叉搜索树 快慢指针

给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

示例:

给定的有序链表: [-10, -3, 0, 5, 9],

一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:

      0
     / \
   -3   9
   /   /
 -10  5

思路

利用快慢指针找到链表中点,再分别递归处理左边和右边。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode sortedListToBST(ListNode head) {
    	//这两个分支判断保证了下面的while至少运行一次,prev非空
        if(head==null)return null;
        if(head.next==null)return new TreeNode(head.val);
        ListNode fast,slow,prev;
        fast=slow=head;
        prev=null;
        while(fast!=null&&fast.next!=null){
            fast=fast.next.next;
            prev=slow;
            slow=slow.next;
        }
        prev.next=null;
        TreeNode tree=new TreeNode(slow.val);
        tree.left=sortedListToBST(head);
        tree.right=sortedListToBST(slow.next);
        return tree;
    }
}

posted @ 2020-02-03 15:50  开局一把刀  阅读(3)  评论(0)    收藏  举报