LeetCode Intersection of Two Linked Lists

Write a program to find the node at which the intersection of two singly linked lists begins.

 

For example, the following two linked lists:

A:          a1 → a2
                   ↘
                     c1 → c2 → c3
                   ↗            
B:     b1 → b2 → b3

begin to intersect at node c1.

 

Notes:

    • If the two linked lists have no intersection at all, return null.
    • The linked lists must retain their original structure after the function returns.
    • You may assume there are no cycles anywhere in the entire linked structure.
      • Your code should preferably run in O(n) time and use only O(1) memory.
        /**
         * Definition for singly-linked list.
         * struct ListNode {
         *     int val;
         *     ListNode *next;
         *     ListNode(int x) : val(x), next(NULL) {}
         * };
         */
        class Solution {
        public:
            ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
                ListNode *a = headA;
                ListNode *b = headB;
                if(headA == NULL || headB == NULL)
                    return NULL;
                
                 int lenA = 0;
                 int lenB = 0;
                 while(a && ++lenA){a = a->next;}
                 while(b && ++lenB){b = b->next;}
                 a = headA;
                 b = headB;
                 if(lenA>lenB)
                 {
                     for(int i=0;i<lenA-lenB;i++)
                     {
                         a = a->next;
                     }
                 }
                 else
                 {
                     for(int i=0;i<lenB-lenA;i++)
                     {
                         b = b->next;
                     }
                 }
                 while(a && b)
                 {
                      if(a==b)
                          return a;
                      
                      a=a->next;
                      b=b->next;
                 }
                 return NULL;
            }
        };

        解题思路:由于链表a,b有公共序列,且公共序列一定在最后面,不可能出现如下情况

        A:          a1 → a2             a3
                           ↘            ↑
                             c1 → c2 → c3
                           ↗            ↓        
        B:     b1 → b2 → b3             b4
      • 所以先求2个链表的长度,并将较长的链表的前端先截去,在开始比较指针的地址是否一致。
posted @ 2014-12-01 14:54  ElephantKing  阅读(116)  评论(0编辑  收藏  举报