力扣日常刷题——(160相交链表、141环形链表)

文章介绍了两种解决链表问题的方法:160题的相交链表通过计算长度差找交点,141题的环形链表利用快慢指针检测循环。在相交链表中,先确定链表长度,然后让长链表先行,直到两者相遇;环形链表则用快慢指针,快指针每次前进两步,慢指针一步,相遇则有环。
摘要由CSDN通过智能技术生成
  1. 160.相交链表

题目:160. 相交链表 - 力扣(LeetCode)

①解决思路

方法1:分别测出A,B链表的长度,再记录它们的差值,先使较长的链表走差值步,然后两个链表同时向后移动,当某一时刻它们指向的下一地址相同时那么下一地址就为相交点。

②代码实践

方法1
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{
    struct ListNode* tailA = headA, *tailB = headB;
    int lenA, lenB;
    lenA = lenB = 1;

    while (tailA->next)
    {
        lenA++;
        tailA = tailA->next;
    }
    while (tailB->next)
    {
        lenB++;
        tailB = tailB->next;
    }

    if (tailA != tailB)
    {
        return NULL;
    }

    int mul = abs(lenA - lenB);
    struct ListNode* longer = headA, *shorter = headB;
    if (lenA < lenB)
    {
        longer = headB;
        shorter = headA;
    }

    while (mul--)
    {
        longer = longer->next;
    }

    while (shorter != longer)
    {
        shorter = shorter->next;
        longer = longer->next;
    }

    return longer;
}
  1. 141.环形链表

题目:141. 环形链表 - 力扣(LeetCode)

①解决思路

方法1:使用快慢指针,快指针一次走两步,慢指针一次走一步,因为相差的步长为一步,所以如果有环的话最终慢指针会追上快指针,而如果没有环的话快指针就会先一步走到空。

②代码实践

bool hasCycle(struct ListNode *head) 
{
    struct ListNode* fast, *slow;
    fast = slow = head;

    while (fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        if (fast == slow)
        {
            return true;
        }
    }

    return false;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值