18. 删除链表的节点
var deleteNode = function(head, val) {
if(!head) return head;
let pre = head;
if(head.val==val) return head.next;
let tmp = null;
while(pre.next){
tmp = pre.next;
if(tmp.val==val){
pre.next = tmp.next;
}
pre = tmp;
tmp = tmp.next;
}
return head;
};
22.链表中倒数第k个结点
//不是双指针
var getKthFromEnd = function(head, k) {
let arr = [];
if(!head) return head;
while(head){
arr.push(head);
head = head.next;
}
return arr[arr.length-k];
};
//快慢指针
var getKthFromEnd = function(head, k) {
let tmp = head;
while(tmp){
tmp = tmp.next;
if(k===0){
head = head.next;
}
else{
k--;
}
}
return head;
};
25. 合并两个排序的链表
var mergeTwoLists = function(l1, l2) {
if(!l1) return l2;
if(!l2) return l1;
let tmp = new ListNode();
const res = tmp;
while(l1&&l2){
tmp.next = new ListNode();
tmp = tmp.next;
if(l1.val>l2.val){
tmp.val = l2.val;
l2 = l2.next;
}
else{
tmp.val = l1.val;
l1 = l1.next;
}
}
if(l1||l2) {
tmp.next = l1?l1:l2;
}
else tmp.next = null;
return res.next;
};
52.两个链表的第一个公共结点
//哈希
var getIntersectionNode = function(headA, headB) {
if(!headA||!headB) return null;
let set = new Set();
while(headA){
set.add(headA);
headA = headA.next;
}
while(headB){
if(set.has(headB)) return headB;
headB = headB.next;
}
return null;
};
//双指针,将两个链表拼成一个,就可以一起遍历了,有公共结点就能拼成一个,没有就会失败返回null
var getIntersectionNode = function(headA, headB) {
if(!headA||!headB) return null;
let A = headA;
let B = headB;
while(A!=B){
A = A?A.next:headB;
B = B?B.next:headA;
}
return A;
};
21. 调整数组顺序使奇数位于偶数前面
//简单粗暴
var exchange = function(nums) {
let res = [];
for(let i of nums){
if(i%2) res.unshift(i);
else res.push(i);
}
return res;
};
//双指针,从左边找偶数,从右边找奇数,交换
var exchange = function(nums) {
let left = 0;
let right = nums.length-1;
while(left<right){
while(nums[left]%2==1){
//是while不是if....
left++;
}
while(nums[right]%2==0){
right--;
}
if(left>=right) break;
const tmp = nums[left];
nums[left] = nums[right];
nums[right] = tmp;
left++;
right--;
}
return nums;
};
58 - I. 翻转单词顺序
var reverseWords = function(s) {
s = s.split(" ");
let res = [];
for(let i of s){
if(i==="") continue;
else res.unshift(i);
}
return res.join(" ").toString();
};
//双指针
var reverseWords = function(s) {
s = s.trim().split(/\s+/g);
// /\s+/g将相连的空格归结为一个
let left = 0;
let right = s.length-1;
while(left<right){
if(s[left]==""){
left++;
continue
}
if(s[right]==""){
right--;
continue;
}
let tmp = s[left];
s[left++] = s[right];
s[right--] = tmp;
}
return s.join(" ").toString();
};
57. 和为s的两个数字
var twoSum = function(nums, target) {
let left = 0;
let right = nums.length-1;
while(left<right){
while(nums[right]>=target){
right--;
}
if(nums[left]+nums[right]>target){
right--;
}
else if(nums[left]+nums[right]<target){
left++;
}
else{
return [nums[left], nums[right]]
}
}
return [];
};
48.最长不含重复字符的子字符串
var lengthOfLongestSubstring = function(s) {
let tmp = [];
let res = 0;
for(let i of s){
if(tmp.indexOf(i)!=-1){
let start = tmp.indexOf(i)+1;
while(start--){
tmp.shift();
}
}
tmp.push(i);
res = Math.max(tmp.length, res);
}
return res;
};
46.把数字翻译成字符串
//变种的青蛙跳台问题, res=tmp+res/tmp注意
var translateNum = function(num) {
if(num<10) return 1;
num = num.toString().split("");
let pre = 1;
let tmp = num[0]+num[1]<'26'&&num[0]+num[1]>='10'?2:1;
let res = tmp;
for(let i =2;i<num.length;i++){
const store = num[i-1]+num[i];
if(store<'26'&&store>='10'){
res = tmp + pre;
}
else{
res = tmp;
}
pre = tmp;
tmp = res;
}
return res;
};