• C\C++刷题DAY5


    目录

    1.第一题

    2.第二题

    3.第三题


    1.第一题

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

    思路分析:

    看链表相不相交,是看链表的地址。把两个链表的地址一一比对,如有有相同的地址,那么相交,如果各不相同,那么肯定不相交。

    但是如果要一一比对的话,时间复杂度是N^2,效果太差了。时间复杂度是N^2的原因是,有可能两个链表的长度不一样。假如两个链表的长度一样的话,就不需要一一比对了,只需要各自位置上的节点对比就行。这样的话时间复杂度是N。

     

     那么现在只要人让长的先走,走到和短的一样长,之后,长的短的一起走。这个时候再去对比地址,相同返回相交的节点,不同返回NULL

    参考代码:

    1. struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)
    2. {
    3. struct ListNode * curA = headA;
    4. struct ListNode * curB = headB;
    5. int lenA = 0;
    6. int lenB = 0;
    7. //找尾
    8. while(curA->next)
    9. {
    10. lenA++;
    11. curA =curA->next;
    12. }
    13. while(curB->next)
    14. {
    15. lenB++;
    16. curB =curB->next;
    17. }
    18. //尾节点不相等就相交
    19. if(curA!=curB)
    20. return NULL;
    21. int gap = abs(lenA-lenB);
    22. struct ListNode* longlist = headA;
    23. struct ListNode* shortlist = headB;
    24. if(lenB>lenA)
    25. {
    26. longlist=headB;
    27. shortlist=headA;
    28. }
    29. //长先走差距步
    30. while(gap--)
    31. {
    32. longlist = longlist->next;
    33. }
    34. //同时走,找交点
    35. while(longlist!=shortlist)
    36. {
    37. longlist =longlist->next;
    38. shortlist =shortlist->next;
    39. }
    40. return longlist;
    41. }

    2.第二题

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

     思路分析:

    利用双指针中的快慢指针,两个指针一个走一步,一个走两步,如果没有环的话,就会走完整个链表,如果有环的话,那么两个指针都会进入到环里面,在环里面的话,就会演变成一个追击的问题,快的总会追上慢的。

    由于快的走两步,慢的走一步,那么快的相对比慢的速度就是1步,那么快的肯定会和慢的相遇,那么就能追上慢的。

     

     (图中为抽象的链表)

    参考代码:

    1. bool hasCycle(struct ListNode *head)
    2. {
    3. struct ListNode* fast = head;
    4. struct ListNode* slow = head;
    5. while(fast && fast->next)
    6. {
    7. slow = slow->next;
    8. fast = fast->next->next;
    9. if(fast == slow)
    10. return fast;
    11. }
    12. return NULL;
    13. }

    PS:思考,为什么设计成快的走2步?

    为什么步设计成快的走3,4,5,6……步呢?

    其实只要是有环的话,快的和慢的都会进入环中,那么假如快的走3步的话,那么和慢的的速度差就是2步,那么就有可能会越过慢的,只要当慢的和快的之间的节点数只差是奇数的话,那么快的总是会越过慢的

    3.第三题

    142. 环形链表 II - 力扣(LeetCode)

     思路分析:

    现在要求的是入环点,

    先上结论:从头节点走到入环点的距离就是相交点走到入环点的距离。

    前提条件:相交点必须是快慢指针的相交点(也就是第二题中的),快指针一次走两步,满指针一次走一步。那么到相交的时候快指针走的距离就是慢指针走的距离的两倍。

    具体的结论分析看下图:

     第二种思路:

    将乡遇点meet置空,然后otherhead作为第二个头节点,那么这个问题可以看成是两个链表的相交问题,相交点就是之前的入环点。 

    第一种思路的参考代码:

    1. struct ListNode *detectCycle(struct ListNode *head)
    2. {
    3. struct ListNode* fast = head;
    4. struct ListNode* slow = head;
    5. while(fast && fast->next)
    6. {
    7. slow = slow->next;
    8. fast = fast->next->next;
    9. if(fast == slow)
    10. {
    11. struct ListNode * meet = slow;
    12. while(head != meet)
    13. {
    14. head=head->next;
    15. meet=meet->next;
    16. }
    17. return meet;
    18. }
    19. }
    20. return NULL;
    21. }
  • 相关阅读:
    自动驾驶 知识点 Review 2D 感知算法 一(两阶段法 R-CNN系列,FPN,R-FCN)
    QT创建子目录项目,可以让项目组织成树形结构的示例:在项目中同时创建Application和第三方动态库(内部)
    机器学习教程
    如果面试官让你设计美团外卖的分库分表架构,就该这么说!
    Redis基本全局命令(含key过期策略)
    Vitis AI 全中文文档集合
    第十三章 实现组件库按需引入功能
    更新暑假做过的项目(医学数据多标签分类与多标签分割,医学数据二分类)
    《最新出炉》系列初窥篇-Python+Playwright自动化测试-4-playwright等待浅析
    java的4种引用类型
  • 原文地址:https://blog.csdn.net/luoheng1114/article/details/128147882