题型一:
有序数组的平方
思路:找到非负数与负数的临界区,平方后前半部分为降序,后半部分为升序。从分界区左右各放置一个指针,向左与向右遍历,依次比较放入新的数组中。某一部分遍历完则将另一部分剩余遍历后放入数组中。
var mid;
for(let i = 0;i<nums.length;i++){
if(nums[i]<=0) mid = i;
else break;
}//找出临界值
var left = mid;
var right = mid+1;
var num = new Array();
while(left>=0||right<nums.length){
if(left<0){
num.push(nums[right]*nums[right]);
right++;
}
else if(right == nums.length){
num.push(nums[left]*nums[left]);
left--;
}
else if((nums[left]*nums[left])<nums[right]*nums[right]){
num.push(nums[left]*nums[left]);
left--;
}
else {
num.push(nums[right]*nums[right]);
right++;
}
}
return num;
题型二:
环形链表
思路:快慢指针,一个每次走一步,另一个每次走两步。倘若两个指针相等了,则说明链表有闭环。
var hasCycle = function(head) {
let slow = head;
let fast = head;
while(fast && fast.next) {
slow = slow.next;
fast = fast.next.next;
if(slow === fast) {
return true;
}
}
return false;
};
题型三:
链表的中间结点
思路:快慢指针,一个每次走一步,另一个每次走两步。快指针到达终点时,慢指针到达的则是中间位置。
var fast = head;
var slow = head;
while(fast&&fast.next){
slow = slow.next;
fast = fast.next.next;
}
return slow;
题型四:
删除链表的倒数第 N 个结点
思路:慢指针指向哑结点,快指针指向头结点。快指针先走N步,然后快慢同时行动。当快指针走到null时,慢指针所在的位置即为倒数第N个结点的前驱结点。然后返回初始哑结点的前驱结点即为初始结点。
var fast = head;
var dummy = new ListNode(0);
dummy.next = head;
slow = dummy;
for(let i = 0;i<n;i++){
fast = fast.next;
}
while(fast){
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
var out = dummy.next;
return out;