当前位置:   article > 正文

每日一题(相交链表 )

每日一题(相交链表 )

欢迎大家来我们主页进行指导
LaNzikinh-CSDN博客


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

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

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

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

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

自定义评测:

评测系统 的输入如下(你设计的程序 不适用 此输入):

  • intersectVal - 相交的起始节点的值。如果不存在相交节点,这一值为 0
  • listA - 第一个链表
  • listB - 第二个链表
  • skipA - 在 listA 中(从头节点开始)跳到交叉节点的节点数
  • skipB - 在 listB 中(从头节点开始)跳到交叉节点的节点数

评测系统将根据这些输入创建链式数据结构,并将两个头节点 headA 和 headB 传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案 。

首先做这个题目有两个核心的关键就是,1.你要判断它是不是相交的。2.它的交点


思路一:暴力求解

依次去A链表中的每个节点跟B链表中的所有节点比较,如果有地址相同的节点,就是相交,第一个相同的就是交点

时间复杂度为O(N^2),非常麻烦,这里就不多说了,我们直接来说思路二


思路二:长度差法

核心:尾结点相同,就是相交否则就不相交,长的链表先走长度差步,再同时走,第一个相同的就是交点

2.1计算长度

先保存两个头结点用来比较长度,因为我遍历完了两个链表,所以把是不是相交一起判断了

  1. //先保存两个头结点用来比较长度
  2. struct ListNode* tailA = headA;
  3. struct ListNode* tailB = headB;
  4. //计算A的长度
  5. int lenA = 1;
  6. while (tailA->next != NULL)
  7. {
  8. lenA++;
  9. tailA = tailA->next;
  10. }
  11. //计算B的长度
  12. int lenB = 1;
  13. while (tailB->next != NULL)
  14. {
  15. lenB++;
  16. tailB = tailB->next;
  17. }
  18. //是不是相交一起判断
  19. if (tailA != tailB)
  20. {
  21. return NULL;
  22. }

2.2判断那个长?

这个用了一个非常巧妙的办法来写出了如何判断这两个长,因为我不知道这两个最开始到底是谁长

  1. //abs取绝对值
  2. int gap = abs(lenA - lenB);
  3. //先假设A长
  4. struct ListNode* long = headA;
  5. struct ListNode* short = headB;
  6. //在做出判断,如果A短就互换
  7. if (lenA < lenB)
  8. {
  9. struct ListNode* long = headB;
  10. struct ListNode* short = headA;
  11. }

2.3长的先走,短的在一起走

  1. //长的先走gap步
  2. while (gap--)
  3. {
  4. long = long->next;
  5. }
  6. //等长的走完,在一起走,之后返回向遇点就可以了
  7. while (long != short)
  8. {
  9. long = long->next;
  10. short = short->next;
  11. }
  12. //返回short也可以
  13. return long;

2.4总代码

  1. struct ListNode* getIntersectionNode(struct ListNode* headA, struct ListNode* headB)
  2. {
  3. //先保存两个头结点用来比较长度
  4. struct ListNode* tailA = headA;
  5. struct ListNode* tailB = headB;
  6. //计算A的长度
  7. int lenA = 1;
  8. while (tailA->next != NULL)
  9. {
  10. lenA++;
  11. tailA = tailA->next;
  12. }
  13. //计算B的长度
  14. int lenB = 1;
  15. while (tailB->next != NULL)
  16. {
  17. lenB++;
  18. tailB = tailB->next;
  19. }
  20. if (tailA != tailB)
  21. {
  22. return NULL;
  23. }
  24. //abs取绝对值
  25. int gap = abs(lenA - lenB);
  26. //先假设A长
  27. struct ListNode* long = headA;
  28. struct ListNode* short = headB;
  29. //在做出判断,如果A短就互换
  30. if (lenA < lenB)
  31. {
  32. struct ListNode* long = headB;
  33. struct ListNode* short = headA;
  34. }
  35. //长的先走gap步
  36. while (gap--)
  37. {
  38. long = long->next;
  39. }
  40. //等长的走完,在一起走,之后返回向遇点就可以了
  41. while (long != short)
  42. {
  43. long = long->next;
  44. short = short->next;
  45. }
  46. //返回short也可以
  47. return long;
  48. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/380449
推荐阅读
相关标签
  

闽ICP备14008679号