首页 > 其他分享 >141. 环形链表

141. 环形链表

时间:2023-04-06 10:45:54浏览次数:37  
标签:head ListNode cur val 141 环形 fast next 链表

 

141. 环形链表

解法一:所到之处,寸草不生

第一种解法自己写的,巧妙运用了链表的val,只要遍历过,就将节点的值设置为1e9,时间空间复杂度都达到了完美的统一(doge)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool hasCycle(ListNode *head) {
        if(head == NULL) return false;
        ListNode* cur = head;

        while(cur->next){
            cur->val = 1e9;
            if(cur->next->val == 1e9) return true;
            cur = cur->next;
            // if(cur->next == head) return true;
            // else{cur = cur->next;}    
        }
        return false;
    }
};

看评论区还有将链表指向直接给改了的,只能说为了解题老本都豁出去了,hhh

还是用官方经典的做法吧

双指针

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
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(fast == slow)return true;
        }
        return false;
    }
};

这里开辟的空间只有两个指针,空间复杂度为O(1).

标签:head,ListNode,cur,val,141,环形,fast,next,链表
From: https://www.cnblogs.com/luxiayuai/p/17291889.html

相关文章

  • 单向链表找到链表的中点
    偶数为n/2奇数为(n+1)/2点击查看代码ListNode*slow=head,*fast=head;while(fast->next!=nullptr&&fast->next->next!=nullptr){slow=slow->next;fast=fast->next->next;}注:需要判断头结点是否为空......
  • 链表反转-JavaDG实现
    对于链表的反转,用常规的迭代法,是很简单的,使用两个指针;对于用递归法,则是很经典题了,我就觉得对于递归方法和常用的迭代法,大家最好都熟悉掌握,不要刻意的去避免哪一点;1•链表反转2○常规的迭代实现:3publicListNodereverseList(ListNodehea......
  • 单链表进阶OJ版--->随机指针问题
    朋友们,晚上好!!今天,推出一篇单链表的随机指针问题!!相较于之前的链表OJ题,本期的链表难度有所提升!!下面请看题:>有一个链表,链表每个结点额外增加一个随机指针random,并且随机指针可以指向链表的任何结点以及空结点至于本题的要求是:复制带随机指针的链表如下图所示:>本题的难度,大致......
  • 反转一个单链表
    示例:输入:1->2->3->4->5->NULL输出:5->4->3->2->1->NULL进阶:你可以使用迭代或者递归来反转链表。你能否用两种方法来解决这个问题。思路我写在了代码当中,欢迎指正。/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;......
  • 四种语言刷算法之重排链表
    力扣143. 重排链表1、C/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/voidreorderList(structListNode*head){structListNode*p=head;intcount=0;while(p){p......
  • 单向链表和双向链表的逆序的两种实现方式
    单向链表的逆序实现方式publicstaticclassNode{privateintval;privateNodenext;publicNode(intval){this.val=val;}}/**实现单向链表的第一种方式,只通过链表指针的重连来实现*/publicstaticNoderece......
  • 25. K 个一组翻转链表
    25.K个一组翻转链表给你链表的头节点head,每 k 个节点一组进行翻转,请你返回修改后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。......
  • 合并两个有序链表
    将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例1:输入:l1=[1,2,4],l2=[1,3,4]输出:[1,1,2,3,4,4]示例2:输入:l1=[],l2=[]输出:[]示例3:输入:l1=[],l2=[0]输出:[0]提示:两个链表的节点数目范围是[0,50......
  • 138. 复制带随机指针的链表
    /*//DefinitionforaNode.classNode{public:intval;Node*next;Node*random;Node(int_val){val=_val;next=NULL;random=NULL;}};*/classSolution{public:Node*copyRandomList(Node*......
  • 链表练习3
    已知整型链表,设计算法,在所有结点值为x的结点前插入结点值为y的结点,插入的结点个数通过函数值返回。#include<stdio.h>#include<stdlib.h>typedefstructnode{//用Node代替structnodeinta;structnode*next;}Node,*LinkList;LinkListcreate();Link......