【路飞】148. 排序链表(归并排序)、1305. 两棵二叉搜索树中的所有元素

79 阅读1分钟

148. 排序链表

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。

示例 1:

输入: head = [4,2,1,3]
输出: [1,2,3,4]

示例 2:

输入: head = [-1,5,3,4,0]
输出: [-1,0,3,4,5]

示例 3:

输入: head = []
输出: []

解题思路:这题也可以用归并排序,需要处理链表,每次都需要将一个数组分成两个链表,代码如下:

var sortList = function(head) {
    //边界条件判断
    if(!head || !head.next) return head;
    let p = head;
    let n = 0;
    //统计链表的长度
    while(p){
        p = p.next;
        n ++;
    }
    return mergeSort(head,n);
};

let mergeSort = function(head,n){
    //结束递归条件判断
    if(!head || !head.next) return head;
    //左边链表的长度
    let l = parseInt(n/2);
    //右边链表的长度
    let r = n - l;
    let lp = head, rp = lp, p;
    //找到右边链表的头节点前一位方便将链表查分成两段
    for(let i = 1; i < l; i ++) rp = rp.next;
    //让p节点等于右边头结点的前一位
    p = rp;
    //获得正真的右边头结点
    rp = rp.next;
    //将左右链表查分
    p.next = null;
    //左边链表排序
    lp = mergeSort(lp,l);
    //右边链表排序
    rp = mergeSort(rp,r);
    let cur = new ListNode();
    //重置p
    p = cur;
    while(lp || rp){
        if(!rp || (lp && lp.val <= rp.val)){
            p.next = lp;
            lp = lp.next;
            p = p.next;
        } else {
            p.next = rp;
            rp = rp.next;
            p = p.next;
        }
    }
    return cur.next;
}

1305. 两棵二叉搜索树中的所有元素

给你 root1 和 root2 这两棵二叉搜索树。请你返回一个列表,其中包含 两棵树 中的所有整数并按 升序 排序。
示例 1:

输入: root1 = [2,1,4], root2 = [1,0,3]
输出: [0,1,1,2,3,4]

示例 2:

输入: root1 = [1,null,8], root2 = [8,1]
输出: [1,1,8,8]

解题思路:二叉搜索树的特性是中序遍历是一个有序数组,所以我们可以现将两个二叉树中序遍历然后合并,代码如下:

var getAllElements = function(root1, root2) {
    if(!root1 && !root2) return [];
    let rot1 = [],rot2 = [];
    //中序遍历第一棵二叉树
    rot1 = treeSort(root1,rot1);
    //中序遍历第二棵二叉树
    rot2 = treeSort(root2,rot2);
    let p1 = 0,p2 = 0,temp = [];
    //合并有序的两棵树
    while(p1 < rot1.length || p2 < rot2.length){
        if(p2 >= rot2.length || (p1 <= rot1.length && rot1[p1] <= rot2[p2])){
            temp.push(rot1[p1 ++]);
        } else {
            temp.push(rot2[p2 ++]);
        }
    }
    return temp;
};
let treeSort = function(root,data){
    if(!root) return data;
    if(root.left) data = treeSort(root.left,data);
    data.push(root.val);
    if(root.right) data = treeSort(root.right,data);
    return data;
}