当前位置:   article > 正文

《手撕链表题系列-8》相交链表_相交链表 手撕

相交链表 手撕

前言

本系列主要讲解链表的经典题

注:划重点!!必考~

链表分割

力扣链接:160. 相交链表 - 力扣(LeetCode) (leetcode-cn.com)

  • 题目描述:

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

  • 示例:

  • 提示:
  • listA 中节点数目为 m
  • listB 中节点数目为 n
  • 0 <= m, n <= 3 * 104
  • 1 <= Node.val <= 105
  • 0 <= skipA <= m
  • 0 <= skipB <= n
  • 如果 listA 和 listB 没有交点,intersectVal 为 0
  • 如果 listA 和 listB 有交点,intersectVal == listA[skipA + 1] == listB[skipB + 1]
  • 解题思路:
  1. 对两个链表进行分别遍历算出长度差
  2. 同时如果两链表末尾结点地址不同,则表示没有两链表没有相交
  3. 对长链表指针先走长度差个结点,再两个指针同时遍历
  4. 当两个结点指针相遇时即为相交节点
  • 参考代码:
  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * struct ListNode *next;
  6. * };
  7. */
  8. struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
  9. //创建寻址指针
  10. struct ListNode*cur1=headA,*cur2=headB;
  11. //计算各链表的长度
  12. int len1=1,len2=1,gas;
  13. while(cur1->next)
  14. {
  15. len1++;
  16. cur1=cur1->next;
  17. }
  18. while(cur2->next)
  19. {
  20. len2++;
  21. cur2=cur2->next;
  22. }
  23. //各链表尾节点不相等则两链表不相交
  24. if(cur1!=cur2)
  25. return false;
  26. //接下来则是必定有相交节点的情况
  27. //判断长短并记录
  28. struct ListNode*geater,*less;
  29. if(len1>=len2)
  30. {
  31. geater=headA;
  32. less=headB;
  33. gas=len1-len2;
  34. }
  35. else
  36. {
  37. geater=headB;
  38. less=headA;
  39. gas=len2-len1;
  40. }
  41. //长链表先走差距长度
  42. while(gas--)
  43. {
  44. geater=geater->next;
  45. }
  46. //一同走,相等时则找到相交节点
  47. while(geater!=less)
  48. {
  49. geater=geater->next;
  50. less=less->next;
  51. }
  52. return geater;
  53. }
  • 结果:

 每日k题无烦恼,点赞学习不得了~

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

闽ICP备14008679号