首页 > 编程语言 >算法刷题记录(day5)

算法刷题记录(day5)

时间:2024-10-29 20:17:54浏览次数:8  
标签:head ListNode day5 nullptr fast next 链表 算法 刷题

LC160.相交链表

题目描述:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if (headA == nullptr || headB == nullptr) {
            return nullptr;
        }

        ListNode* pa = headA;
        ListNode* pb = headB;

        while (pa != pb) {
            pa = pa == nullptr ? headB : pa->next;
            pb = pb == nullptr ? headA : pb->next;
        }

        return pa;
    }
};

LC206.反转链表

题目描述:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
       ListNode* pre = nullptr;
       ListNode* cur = head;
       
       while (cur != nullptr) {
            ListNode* temp = cur->next;
            cur->next = pre;
            pre = cur;
            cur = temp;
       }

       return pre;
    }
};

LC234.回文链表

题目描述 :给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。

解题思路:可以将链表分为两段,找到链表前半段的结尾位置,反转后半段链表,最后通过遍历两个链表并进行比较得出结果,最后将链表复原。

class Solution {
public:
    //找到前半段的结尾节点
    ListNode* find1(ListNode* head) {
        ListNode* slow = head, * fast = head;

        while (fast->next != nullptr && fast->next->next != nullptr) {
            fast = fast->next->next;
            slow = slow->next;
        }

        return slow;
    }

    //反转后半段链表 并返回反转后的起始节点
    ListNode* find2(ListNode* head) {
        ListNode* pre = nullptr;
        ListNode* cur = head;

        while (cur != nullptr) {
            ListNode* temp = cur->next;
            cur->next = pre;
            pre = cur;
            cur = temp;
        }

        return pre;
    }

    bool isPalindrome(ListNode* head) {
        if (head == nullptr) return true;

        ListNode* FirstEnd = find1(head);
        ListNode* SecondStart = find2(FirstEnd->next);

        //用来遍历比较
        ListNode* left = head;
        ListNode* right = SecondStart;

        //bool res = true;    //用来标记
        while (left && right) {
            if (left->val != right->val) {
                return false;
            }

            left = left->next;
            right = right->next;
        }

        //复原链表
        FirstEnd->next = find2(SecondStart);

        return true;
    }
};

LC141.环形链表

题目描述:给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。如果链表中存在环 ,则返回 true 。 否则,返回 false 。

解题思路:使用快慢指针即可。

class Solution {
public:
    bool hasCycle(ListNode *head) {
       ListNode* fast = head;
       ListNode* slow = head;

       while (fast != nullptr && fast->next != nullptr) {
            fast = fast->next->next;
            slow = slow->next;

            if (slow == fast) return true;
       }

       return false;
    }
};

LC142.环形链表 II

题目描述:给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改 链表。

解题思路:与LC141类似,首先利用快慢指针找到slow == fast的位置,再设置两个指针分别指向头节点与当前slow节点,进行遍历,最后当两指针所指位置相同时,返回结果。本题与数学问题中的追及问题类似,在草稿纸上演算一下更为清晰。

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode* fast = head;
        ListNode* slow = head;

        while (fast != nullptr && fast->next != nullptr) {
            slow = slow->next;
            fast = fast->next->next;

            if (slow == fast) {
                ListNode* index1 = slow;
                ListNode* index2 = head;
                while (index1 != index2) {
                    index1 = index1->next;
                    index2 = index2->next;
                }

                return index1;
            }
        }

        return nullptr;
    }
};

标签:head,ListNode,day5,nullptr,fast,next,链表,算法,刷题
From: https://blog.csdn.net/Ackerman273/article/details/143337690

相关文章

  • 字符串匹配-KMP算法实现代码
    字符串的基本操作同上一篇BF算法一致一.为模式串创建临时数组//KMP算法//1)为模式串创建临时数组voidcomputeLPSArray(char*pat,intM,int*lps){ //指向首元素 intj=0; //指向首元素的下一个元素 inti=1; //临时数组的首元素总为0 lps[0]=0; //结束条......
  • 【算法】分治算法-让问题消失
    博主推荐!!!:"近期我偶然邂逅了一个极为出色的人工智能学习平台,它不仅内容深入浅出,讲解方式还风趣幽默,让人学习起来既轻松又高效。如此宝藏资源,我迫不及待想要与各位共享,让我们一起进入这个精彩纷呈的学习网站吧!"即刻点击https://www.captainbed.cn/cyy算法系列:今天,我们要聊的......
  • 【算法学习】基环树
    基环树基环树就是类似于在树上加了一条边形成了环,去点环上的一条边后就会变成数,如下图。这是一个\(n\)个点\(n\)条边的连通图,如果不保证联通,它就会成为基环树森林。外向树:每个点都只有一条入边,因为向内上。内向树:每个点都只有一条出边,因为向外少。怎么用呢?因为有环的性......
  • 算法:查找
    算法1.顺序查找和折半查找1.1顺序查找1.2折半查找1.3索引顺序查找2.树表查找2.1查找2.2插入3.哈希表及哈希查找3.1哈希造表3.2处理冲突开放定址法链地址法3.3哈希查找查找是非数值数据处理中一种基本运算,查找运算的效率与查找表所采用的数据结构和查找......
  • 解码小红书CES算法,让你的笔记阅读量提升100%
    随着社交媒体成为日常生活的一部分,内容创作者们都在积极寻找提高作品可见性的方法。作为社交分享领域的佼佼者,小红书凭借其独特的CES算法机制,在众多平台中脱颖而出。本文将深入探讨小红书的CES算法工作原理,并提供实用技巧,帮助你显著提升笔记的阅读量。一、小红书CES算法解......
  • (算法)最⻓公共⼦序列————<动态规划>
    1.题⽬链接:1143.最⻓公共⼦序列2.题⽬描述:3.解法(动态规划):算法思路:1.状态表⽰:对于两个数组的动态规划,我们的定义状态表⽰的经验就是:        i.选取第⼀个数组[0,i]区间以及第⼆个数组[0,j]区间作为研究对象;        ii.结合题⽬要求,定义状态......
  • 点云学习笔记4——点云滤波降采样后进行4PCS粗配准【四点一致集配准算法(4-Point Congr
    #include<iostream>#include<pcl/point_cloud.h>#include<pcl/point_types.h>#include<pcl/filters/voxel_grid.h>#include<pcl/common/common_headers.h>#include<pcl/io/pcd_io.h>#include<pcl/visualization/cloud_vi......
  • 【回溯算法】(第七篇)
    目录⼦集(medium)题目解析讲解算法原理编写代码找出所有⼦集的异或总和再求和(easy)题目解析讲解算法原理编写代码⼦集(medium)题目解析1.题目链接:.-力扣(LeetCode)2.题目描述给你⼀个整数数组nums,数组中的元素互不相同。返回该数组所有可能的⼦集(幂集)。解集不能包......
  • 【综合算法练习】(第八篇)
    目录全排列Ⅱ(medium)题目解析讲解算法原理编写代码电话号码的字⺟组合(medium)题目解析讲解算法原理编写代码全排列Ⅱ(medium)题目解析1.题目链接:.-力扣(LeetCode)2.题目描述给定⼀个可包含重复数字的序列nums,按任意顺序返回所有不重复的全排列。•⽰例1:输⼊:num......
  • 百度二面算法:合法的括号字符串
    目录标题1.题目1.1示例2.利用栈求解2.1代码结构分析2.1.1代码优缺点1.题目给定一个字符串s,字符串s只包含以下三种字符:(,*,),请你判断s是不是一个合法的括号字符串。合法括号字符串有如下规则:左括号’(‘必须有对应的右括号’)’右括号’)‘必须有对应的左括号......