前端力扣刷题_数据结构篇(链表)

这篇博客探讨了多种链表操作的高效算法,包括合并k个有序链表、反转链表、删除链表节点、查找链表相交节点和环的入口节点,以及获取链表中倒数第k个节点。这些算法利用双指针和递归策略,实现了复杂链表问题的简洁解决方案。
摘要由CSDN通过智能技术生成

合并k个有序链表

var mergeKLists = function(lists) {
    let ans=null;
    for(let i=0;i<lists.length;i++){
        ans=mergeTwoLists(ans,lists[i]);
    }
    return ans;
};
function mergeTwoLists(list1,list2){//合并两个有序链表,递归
    if(list1===null) return list2;
    if(list2===null) return list1;
    if(list1.val<=list2.val){
        list1.next= mergeTwoLists(list1.next,list2); 
        return list1;
    }else{
        list2.next=mergeTwoLists(list1,list2.next);
        return list2;
    }
}

绝大多数链表题都是用双指针去做:

反转链表
在这里插入图片描述
第一行是暂存;第二行是改变箭头指向;后两行是移动指针。

var reverseList = function(head) {
	if(head===null) return null;
    let pre=null,cur=head;
    let tmp;
    while(cur!==null){
        tmp=cur.next;//暂存cur的下一位
        cur.next=pre;//反转箭头指向,使cur指向左边的pre
        pre=cur;//先移动pre
        cur=tmp;//再移动cur
    }
    return pre;
};

删除链表的结点

var deleteNode = function(head, val) {
    if(head.val===val) return head.next;
    let pre=null,cur=head;
    while(cur.val!==val){
        pre=cur;
        cur=cur.next;
    }
    pre.next=cur.next;
    return head;
};

不给head的情况:

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

两个链表的第一个公共结点(相交链表)

var getIntersectionNode = function(headA, headB) {
    if(headA===null||headB===null) return null;
    let p1=headA,p2=headB;
    while(p1!==p2){
        p1= p1===null? headB:p1.next;
        p2= p2===null? headA:p2.next;
    }
    return p1;
};

链表中环的入口结点(环形链表Ⅱ)!!!
在这里插入图片描述

var detectCycle = function(head) {
    if(head===null||head.next===null) return null;
    let slow=head,fast=head;
    while(fast!==null&&fast.next!==null){
        slow=slow.next;
        fast=fast.next.next;
        //如果相遇,即存在环
        if(fast===slow){
            let fast=head;
            while(fast!==slow){
                slow=slow.next;
                fast=fast.next;          
            }
            return fast;           
        }
    }
    return null;
};

链表中倒数第k个结点

var getKthFromEnd = function(head, k) {
    let fast=slow=head;
    let count=0;
    while(fast!==null){
        if(count>=k){
        slow=slow.next;
        }
    fast=fast.next;
    count++;
    }
//    if(count<k) return null;//此if对应while里的判断count>k的相反case
    return slow;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值