代码改变世界

Intersection of Two Linked Lists

2015-03-08 10:50  笨笨的老兔子  阅读(138)  评论(0编辑  收藏  举报

存在两个单向链表,如果两者在某个节点相交合并,则返回交点,不相交则返回null。

思路:如果两个链表长度相等,则两个指针依次前进,到结尾之前如果遇到val值相等,则返回该节点。如果不相等,则长的那个链表先走若干步,使得剩下的步数与短的链表的步数相同。

注意点

  • 空指针
  • 由于是单链表,需要保存链表头

    1. class Solution {
    2. public:
    3. ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
    4. if (headA == NULL || headB == NULL)
    5. {
    6. return NULL;
    7. }
    8. int lengthA = 0, lengthB = 0;
    9. ListNode* tmpA = headA;
    10. ListNode* tmpB = headB;
    11. while (tmpA->next != NULL)
    12. {
    13. lengthA++;
    14. tmpA = tmpA->next;
    15. }
    16. while (tmpB->next != NULL)
    17. {
    18. lengthB++;
    19. tmpB = tmpB->next;
    20. }
    21. if (tmpA->val != tmpB->val)
    22. return NULL;
    23. tmpA = headA;
    24. tmpB = headB;
    25. if (lengthA >lengthB)
    26. {
    27. for (size_t i = 0; i < lengthA-lengthB; i++)
    28. {
    29. headA = headA->next;
    30. }
    31. }
    32. else
    33. {
    34. for (size_t i = 0; i < lengthB - lengthA; i++)
    35. {
    36. headB = headB->next;
    37. }
    38. }
    39. while (headA != NULL)
    40. {
    41. if (headA->val == headB->val)
    42. {
    43. return headA;
    44. }
    45. else
    46. {
    47. headA = headA->next;
    48. headB = headB->next;
    49. }
    50. }
    51. }
    52. };