码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode Intersection of Two Linked Lists

时间:2014-12-01 15:54:42      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   ar   color   sp   for   on   div   

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个链表的长度,并将较长的链表的前端先截去,在开始比较指针的地址是否一致。

LeetCode Intersection of Two Linked Lists

标签:style   blog   io   ar   color   sp   for   on   div   

原文地址:http://www.cnblogs.com/55open/p/4135062.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!