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;
}