首页 > 其他分享 >leetcode练习(4.2)

leetcode练习(4.2)

时间:2024-04-03 14:01:50浏览次数:21  
标签:head ListNode struct 4.2 练习 next 链表 节点 leetcode

1.相交链表

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

图示两个链表在节点 c1 开始相交

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。

提示:

  • listA 中节点数目为 m
  • listB 中节点数目为 n
  • 1 <= m, n <= 3 * 104
  • 1 <= Node.val <= 105
  • 0 <= skipA <= m
  • 0 <= skipB <= n
  • 如果 listA 和 listB 没有交点,intersectVal 为 0
  • 如果 listA 和 listB 有
  • 交点,intersectVal == listA[skipA] == listB[skipB]

​
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct ListNode ListNode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
 

    //写法二(假设法)
    ListNode* curA = headA;
    ListNode* curB = headB;
    int countA = 0;
    int countB = 0;
    while(curA->next)
    {
        curA = curA->next;
        countA++;
    }
      while(curB->next)
    {
        curB = curB->next;
        countB++;
    }
    //现在二者都指向尾节点,若他两不相等,则一定不相交'
    if(curB!=curA)
    {
        return NULL;
    }
    //现在二者一定相交啦
    //相对位置都在尾节点,差值也不会变
    int sub = abs(countA-countB);
    ListNode* longList = headA;
    ListNode* shortList = headB;
    //假设A是长链表,B是短的链表,不是的化再反转
    if(countA < countB)
    {
        longList = headB;
        shortList = headA;
    } 
    //统一出发点
    while(sub--)
    {
        longList = longList->next;
    }
    //现在二者一定相交,且出发点一致,一路到底找出交点
    while(shortList != longList)
    {
        shortList = shortList ->next;
        longList = longList->next;
    }
    return longList;
}

​

 2.链表回文结构

对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。

给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

测试样例:

1->2->2->1
返回:true

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
typedef struct ListNode ListNode;
class PalindromeList {

public:

struct ListNode* reverseList(struct ListNode* head) {
    ListNode* n1 = NULL;
    if(head==NULL)
    {
        return head;
    }
    ListNode* n2 = head;
    ListNode *n3 = head->next;
    while(n2)
    {
        n2->next = n1;
        n1 = n2;
        n2 = n3;
        if(n3)
        { 
           n3 = n3->next;
        }
    }
    return n1;
}
struct ListNode* middleNode(struct ListNode* head) {

    ListNode *p1,*p2;
    p1 = p2 = head;
    while(p2&&p2->next)
    {
        p1 = p1->next;
        p2 = p2->next->next;
    }
    return p1;

}
    bool chkPalindrome(ListNode* A) {
        // write code here
       ListNode* mid = middleNode(A);
       ListNode* rMid = reverseList(mid);
       while(A&&rMid)
       {
        if(A->val!=rMid->val)
        {
            return false;
        }
        A = A ->next;
        rMid = rMid ->next;
       }
       return true;
    }
};

3.环形链表

给你一个链表的头节点 head ,判断链表中是否有环。

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

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

提示:

  • 链表中节点的数目范围是 [0, 104]
  • -105 <= Node.val <= 105
  • pos 为 -1 或者链表中的一个 有效索引 。

 

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct ListNode ListNode;
bool hasCycle(struct ListNode *head) {
    ListNode *slow = head,*fast = head;
    //链表不为空且链表有多个节点
    //若链表不存在环,则一定可以走到尽头
    while(fast&&fast->next)
    {
        fast = fast->next->next;
        slow = slow->next;
        if(fast==slow)
        {
            return true;
        }
    }
    return false;
}

4.环形链表2

给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

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

不允许修改 链表。

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入:head = [1,2], pos = 0
输出:返回索引为 0 的链表节点
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

输入:head = [1], pos = -1
输出:返回 null
解释:链表中没有环。

提示:

  • 链表中节点的数目范围在范围 [0, 104] 内
  • -105 <= Node.val <= 105
  • pos 的值为 -1 或者链表中的一个有效索引

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct ListNode ListNode;
struct ListNode *detectCycle(struct ListNode *head) {
    ListNode *slow = head,*fast = head;
    while(fast&&fast->next)
    {
        fast = fast->next->next;
        slow = slow->next;
        if(fast==slow)
        {
            ListNode* meet = slow;
            while(meet!=head)
            {
                meet = meet->next;
                head = head->next;
            }
            return meet;
        }
    }
    return NULL;
}

 

标签:head,ListNode,struct,4.2,练习,next,链表,节点,leetcode
From: https://blog.csdn.net/2301_80464369/article/details/137280257

相关文章

  • Python新手太需要了,这5个做题练习网站爱了!
    前言学习编程语言,练习必不可少,在练习和做题的过程中能够查漏补缺,清楚自己在理论学习过程中的不足和薄弱点,加深对于Python的理解和认识。今天就着重的给大家推荐一些适合「新手」练习的Python做题网站。请注意,这里强调的是「新手」,所以,上来就推leetcode、牛客、codewar的......
  • 【经典算法】LeetCode 21:合并两个有序链表Java/C/Python3实现含注释说明,Easy)
    合并两个有序链表题目描述思路及实现方式一:迭代(推荐)思路代码实现Java版本C语言版本Python3版本复杂度分析方式二:递归(不推荐)思路代码实现Java版本C语言版本Python3版本复杂度分析总结相似题目标签:字符串处理、前缀判断题目描述将两个升序链表合并为一个新的升......
  • LeetCode 2461. Maximum Sum of Distinct Subarrays With Length K
    原题链接在这里:https://leetcode.com/problems/maximum-sum-of-distinct-subarrays-with-length-k/description/题目:Youaregivenanintegerarray nums andaninteger k.Findthemaximumsubarraysumofallthesubarraysof nums thatmeetthefollowingconditi......
  • python 面试题练习总结
    python搜索模块的顺序为:内建模块>当前路径,即执行Python脚本文件所在的路径>环境变量中的PYTHONPATH>python安装路径,故答案为C一、导入模块的搜索顺序:(1)首先导入内建模块。首先判断这个module是不是built-in即内建模块,如果是内建模块则引入内建模块,如果不是则在一个称为sys.pat......
  • VS2022+QT5.14.2开发VS QT Tool的使用
    1.安装环境vs2022+QT5.14.2qtvstool(vsaddin)的使用遇到的坑1.安装qt-vsaddin-msvc2022-3.0.2.vsix安装失败2.安装qt-vsaddin-msvc2022-2.8.0.vsix在qtSetting->qtmodels模块管理中,没有Selectmodel的功能选项如下图位置3.卸载版本vsaddin_2.8.0后安装qt-vsaddin-msvc2......
  • 字符串相关知识与练习
    字符串(String):是用一对双引号括起来的零个或多个字符组成的有限序列。在Java中,字符串被当作对象来处理。程序中需要用到的字符串可以分为两大类:String类:创建之后不会再做修改和变动的字符串常量;StringBuffer类:创建之后允许再做更改和变化的字符串变量。一:找处连续最长数字......
  • 2024.4.2
    今天中润资源涨停突破了,下午多次开板,有可能是在吸浮筹,也有可能是出货,两种都有可能相传炒股养家上船了,还有机构仓位,如果是这样,那么行情决定不会这么快就结束,而是刚刚开始这个位置是地位,机构的成本大概就是4块,所以如果开启上涨行情,那么现在属于上涨的初期,如果上涨那么起码超过6块,......
  • leetcode128. 最长连续序列【三种方法; 并查集; hashtable】
    文章目录1O(nlo......
  • 就业班 第二阶段(python) 2401--4.2 day1 python初识
    一、Python语言介绍1、Python发展历史2、Python简介3、Python特点4、Python的能力二、Linux编译安装Python31、源码安装1、安装依赖软件包2、下载3、解压安装4、配置共享库文件5、测试python36、测试pip32、配置使用国内源安装第三方模块1、创建配置文件补充内容四、......
  • Leetcode--第1题(暴力解法C语言版)
    题目:给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。/***Note:Thereturnedarraymustbemalloced,assum......