javaScript力扣刷题——简单链表(一)

21. 合并两个有序链表

第一次看链表的题,完全不知道链表该如何表示。即使题目给的是数组形式,但是不可以使用数组进行排序的。因为格式是链表。

非递归方法

/**
 * 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;
   }
};

206. 反转链表

迭代法。不需要建一个新链表,建一个新空节点就可以了。

标记新节点时,使用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)

237. 删除链表中的节点

看的解题思路,好聪明啊。把node值复制为下一个节点的值,删除下一个节点就可以了。这样就不用知道前一个结点。

var deleteNode = function(node) {
    node.val = node.next.val;
    node.next = node.next.next; 
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值