第一次看链表的题,完全不知道链表该如何表示。即使题目给的是数组形式,但是不可以使用数组进行排序的。因为格式是链表。
非递归方法
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var mergeTwoLists = function(l1, l2) {
let node = new ListNode(-1);//建立新链表
let p = node;
while(l1!=null&&l2!=null){
if(l1.val<l2.val){
p.next = l1;
l1 = l1.next;
}else{
p.next = l2;
l2 = l2.next;
}
p = p.next;
}
if(l1!=null){p.next = l1;}
if(l2!=null){p.next = l2;}//更简洁的判断 l1!=null?p.next = l1:p.next = l2;
//但是时间变长了。。。
return node.next;
};
递归方法,时间大大提升,且不用创造新列表,在原有的基础上从头比较,插入。
递归减少一次循环。
var mergeTwoLists = function(l1, l2) {
if(l1==null){
return l2;
}
if(l2==null){
return l1;
}
if(l1.val < l2.val){
l1.next = mergeTwoLists(l1.next,l2);
return l1;
}else{
l2.next = mergeTwoLists(l1,l2.next);
return l2;
}
};
迭代法。不需要建一个新链表,建一个新空节点就可以了。
标记新节点时,使用const。
完成局部反转,并后移。
var reverseList = function(head) {
let cur = null;
let pre = head;
while(pre){
const next = pre.next;
pre.next = cur;
cur = pre;
pre = next;
}
return cur;
};
递归法。
且注意有用到head.next.next和head.next,所以要注意是不是仅剩下一个节点或者是空节点的情况。
两个return都要写,reverseList 输出情况为Head [3] newHead [3,2] newHead [3,2,1]。
var reverseList = function(head) {
if(head==null||head.next == null){
return head;
}
const newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
};
还是不太会,慢慢那体会吧。【反转链表】:双指针,递归,妖魔化的双指针 - 反转链表 - 力扣(LeetCode) (leetcode-cn.com)
看的解题思路,好聪明啊。把node值复制为下一个节点的值,删除下一个节点就可以了。这样就不用知道前一个结点。
var deleteNode = function(node) {
node.val = node.next.val;
node.next = node.next.next;
};