有序数组的平方

思路:找到非负数与负数的临界区,平方后前半部分为降序,后半部分为升序。从分界区左右各放置一个指针,向左与向右遍历,依次比较放入新的数组中。某一部分遍历完则将另一部分剩余遍历后放入数组中。
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;
合并两个有序数组

思路:逆向双指针
与双指针不同的是,利用nums1后面的多余空间来填补,避免覆盖nums1数据所需要创建一个新的数组。
空间复杂度降低了。
var merge = function(nums1, m, nums2, n) {let p1 = m-1;let p2 = n-1;let need = m + n -1;var temp;while(p1>=0||p2>=0){if(p1 ==-1){temp = nums2[p2--];}else if(p2 ==-1){temp = nums1[p1--];}else if(nums1[p1]>nums2[p2]){temp = nums1[p1--];}else temp = nums2[p2--];nums1[need--] = temp;}return nums1;};
