首页 > 编程语言 >代码随想录算法训练营第4天 | 链表 |

代码随想录算法训练营第4天 | 链表 |

时间:2024-03-23 20:56:17浏览次数:21  
标签:slow ListNode 训练营 随想录 fast next 链表 curB curA

24两两交换列表元素

ListNode* swapPairs(ListNode* head) {
    ListNode* shead = new ListNode();   //初始化
    shead->next = head;
    ListNode* cur = shead;
    ListNode* tmp;

    //确定先后顺序很重要
    while (cur->next!=nullptr && cur->next->next!=nullptr) {
        tmp = cur->next;
        cur->next = cur->next->next;
        tmp->next = cur->next->next;
        cur->next->next = tmp;

        cur = cur->next->next;
    }
    return shead->next;
}

19删除链表的倒数第N个节点

难点:实现一次扫描

解法:快慢指针

ListNode* removeNthFromEnd(ListNode* head, int n) {

    ListNode* shead = new ListNode();
    shead->next = head;

    ListNode* fast, *slow;
    fast = shead;
    slow = shead;  //slow指向被删除的前一个元素

    while (n--)
    {
        fast = fast->next;
    }
    
    while (fast->next)
    {
        fast = fast->next;
        slow = slow->next;
    }

    ListNode* tmp = slow->next;
    slow->next = tmp->next;
    delete tmp;
    tmp = nullptr;

    return shead->next;
}

面试题 02.07. 链表相交

长短链表长度差为x,则长链表的前x个元素不可能是相交点,从长链表的第x+1个元素开始比较

ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
    if (!headA || !headB)
        return 0;
    
    int a = 1, b = 1;
    ListNode* curA, * curB;
    curA = headA;
    curB = headB;

    while (curA->next) {
        a++;
        curA = curA->next;
    }
    while (curB->next) {
        b++;
        curB = curB->next;
    }

    int x = a - b;

    curA = headA;
    curB = headB;

    if (x > 0) {
        while (x--)
            curA = curA->next;
        for (int i = 0; i < b; i++) {
            if (curA == curB)
                return curA;
            else
            {
                curA = curA->next;
                curB = curB->next;
            }
        }
    }
    else {
        x = -x;
        while (x--)
            curB = curB->next;
        for (int i = 0; i < a; i++) {
            if (curA == curB)
                return curB;
            else
            {
                curA = curA->next;
                curB = curB->next;
            }
        }
    }
    return nullptr;
}

142环形链表II

  • 若链表有环,快慢指针可能会相遇
  • 快指针+=2,慢指针+=1,快指针以每步1步长的速度接近慢指针,不会错过,在慢指针进入环的第一圈一定会被快指针追上
  • (x + y) * 2 = x + y + n (y + z)
    x = (n-1)(y+z) + z
    • 当n=1时,x = z
    • 当n>1时,快指针多走了n-1圈
    • index1从相遇点出发,index2从head出发,将在环的入口相遇
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode* fast = head;
        ListNode* slow = head;
        while(fast != NULL && fast->next != NULL) {
            slow = slow->next;
            fast = fast->next->next;
            // 快慢指针相遇,此时从head 和 相遇点,同时查找直至相遇
            if (slow == fast) {
                ListNode* index1 = fast;
                ListNode* index2 = head;
                while (index1 != index2) {
                    index1 = index1->next;
                    index2 = index2->next;
                }
                return index2; // 返回环的入口
            }
        }
        return NULL;
    }
};

标签:slow,ListNode,训练营,随想录,fast,next,链表,curB,curA
From: https://www.cnblogs.com/ddup-cpp/p/18091501

相关文章

  • 线性表的单链表
    目录1>.单链表的定义和表示2>.单链表基本操作1.初始化2.取值3.查找4.插入5.删除1>.单链表的定义和表示1.基本概念特点:用一组任意的存储单元存储线性表的数据元素(存储单元可以连续,也可以不连续)。对数据元素ai,存储本身的信息和一个指示直接后继的存储位置,这两部分信......
  • 03天【代码随想录算法训练营34期】第二章 链表part01(203.移除链表元素 、707.设计链表
    203.移除链表元素竟然可以做个假head,学到了classListNode(object):def__init__(self,val=0,next=None):self.val=valself.next=nextclassSolution(object):defremoveElements(self,head,val):dummy_head=ListNode(-1)......
  • 代码随想录算法训练营第五十五天| ● 583. 两个字符串的删除操作 ● 72. 编辑距离
    两个字符串的删除操作 题目链接:583.两个字符串的删除操作-力扣(LeetCode)思路:第一次尝试用画图法,然后肉眼观察dp递归规律……但是dp[i][j]的含义还是参考昨天的思路,表示到此处需要删除多少个字符。classSolution{public:intminDistance(stringword1,stringword2......
  • 代码随想录算法训练营第3天 | 链表 |虚拟头哨兵
    链表理论基础链表节点的定义structListNode{intval;//节点上存储的元素ListNode*next;//指向下一个节点的指针ListNode(intx):val(x),next(NULL){}//节点的构造函数};==如果不自己定义构造函数,就无法通过ListNodep(5);来初始化203删除......
  • 代码随想录算法训练营day31 | leetcode 455. 分发饼干、376. 摆动序列、53. 最大子数
    目录贪心理论基础核心:题目链接:455.分发饼干-简单题目链接:376.摆动序列-中等题目链接:53.最大子数组和-中等贪心理论基础核心:由局部推全局最优题目链接:455.分发饼干-简单题目描述:假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每......
  • 代码随想录算法训练营第十八天| 513. 找树左下角的值 112. 路径总和 113. 路径总和
    513.找树左下角的值https://leetcode.cn/problems/find-bottom-left-tree-value/description/publicintfindBottomLeftValue(TreeNoderoot){intval=0;Deque<TreeNode>deque=newArrayDeque<>();deque.offer(root);whi......
  • 【代码随想录】零钱兑换
    题目描述分析这道题分析起来并不难。递推公式也能分析出来,但是我当时写的时候疑惑的一个问题就是:如何判断硬币组合的总额刚好等于需要的金额,因为这里的dp数组很明显是组成总金额所需的最少硬币个数。我试着加了一个数组存储当前情况下的金额。但是想一下就知道这样太笨了。实......
  • 代码随想录算法训练营第day54|392.判断子序列 、 115.不同的子序列
    目录392.判断子序列115.不同的子序列392.判断子序列力扣题目链接(opensnewwindow)给定字符串s和t,判断s是否为t的子序列。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而......
  • 【代码随想录】零钱兑换II(关于组合与排列的区别)
    题目描述分析按动态规划的分析步骤分析的话,代码是不难写出来的,但是写出来后你就会发现,结果不对,多出了很多组合:解决方法:什么都不用改,直接把两个循环调换即可。。代码如下:#include<bits/stdc++.h>usingnamespacestd;intchange(intamount,vector<int>&coins){ i......
  • 数据结构——单向链表(C语言版)
    在数据结构和算法中,链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在C语言中,我们可以使用指针来实现单向链表。下面将详细介绍如何用C语言实现单向链表。目录1.定义节点结构体2.初始化链表3.插入节点4.删除节点5.遍历链......