LeetCode 19 删除链表的倒数第N个结点
//用数组存储,再修改对应索引的节点。(一次循环时间复杂度应该不算高了,居然之打败了6%)
var removeNthFromEnd = function(head, n) {
if(head.next===null&&n===1){
return head.next;
}
let arr = [];
let tmp = head;
while(tmp!==null){
arr.push(tmp);
console.log(tmp);
tmp = tmp.next;
}
let len = arr.length;
if(n===len){
return arr[1]
}
arr[len-n-1].next = arr[len-n].next;
return head;
};
//快慢指针,需要注意的是n与链表长度相同的边界,此时slow就是倒数第n个结点。
//但是n短于链表长度时,slow不是指向倒数第n个结点的,而是这个结点的前一个结点。
var removeNthFromEnd = function(head, n) {
if(head.next===null&&n===1) return head.next;
let fast = head;
let slow = head;
while(--n){
fast = fast.next;
}
if(fast.next===null){
return slow.next;
}
fast = fast.next;
while(fast.next!==null){
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return head;
};
LeetCode 206 反转链表
//暴力
var reverseList = function(head) {
let store = [];
let tmp = head;
while(tmp!==null){
store.unshift(tmp.val);
tmp = tmp.next;
}
let res = new ListNode();
let final = res;
for(let i of store){
let node = new ListNode(i);
console.log(node)
res.next = node;
res = node;
}
return final.next;
};
//迭代,需要注意的是store不是储存cur,因为后面cur.next已经改变了,这个store是直接储存cur.next的。
//迭代的思想就是从前面开始改变指针的方向,注意head结点会变成最后一个结点,所以前面需要补null。
var reverseList = function(head) {
let pre = null;
let cur = head;
while(cur){
let store = cur.next;
cur.next = pre;
pre = cur;
cur = store;
}
return pre;
};
LeetCode 21 合并两个有序链表
//双指针
var mergeTwoLists = function(list1, list2) {
let left = list1;
let right = list2;
let store = new ListNode();
let res = store;
while(left!=null||right!=null){
let tmp = new ListNode();
if(left===null){
tmp.val = right.val;
right = right.next;
}
else if(right===null){
tmp.val = left.val;
left = left.next;
}
else{
if(left.val>=right.val){
tmp.val = right.val;
right = right.next;
}
else{
tmp.val = left.val;
left = left.next;
}
}
store.next = tmp;
store = tmp;
}
return res.next;
};
//递归,好像啥也没做,但是跑出来还很快,除了我不李姐,都挺好。
var mergeTwoLists = function(list1, list2) {
if(list1===null){
return list2;
}
if(list2===null){
return list1;
}
if(list1.val>list2.val){
list2.next = mergeTwoLists(list1,list2.next);
return list2;
}
else{
list1.next = mergeTwoLists(list1.next,list2);
return list1;
}
};
LeetCode 234 回文链表
//官方的解法都是需要遍历一次的,就不写递归和快慢指针了。
//将结点的值输入数组,判断数组是否为回文。(也可以存到string然后reverse判断是否相等。)
var isPalindrome = function(head) {
let store = [];
while(head!==null){
store.push(head.val);
head = head.next;
}
for(let i = 0;i<store.length/2;i++){
if(store[i]===store[store.length-i-1]){
continue;
}
return false;
}
return true;
};
//进化了
var isPalindrome = function(head) {
let store = [];
while(head!==null){
store.push(head.val);
head = head.next;
}
return store.toString()===store.reverse().toString();
};