leetcode[160] Intersection of Two Linked Lis

系统 1484 0

那几题要15刀才能测试的就先放着了。先吧可以在线测试的刷了。

这题是找到零个链表的相交的那个节点。如果没有相交,那就返回NULL。

思路一:

如果有相交,那么他们相交点之后的节点肯定都是共有的,然后两个链表有长有短的话,就先把长的读到和短的一样长,然后两个人在同时走,走到第一个相同的点就是答案了。如果相同的点是NULL了,那就是没有相交点。

      
        /*
      
      
        *

 * 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 
      
      *l1 = headA, *l2 =
      
         headB;

        
      
      
        if
      
       (!headA || !headB) 
      
        return
      
      
         NULL;

        
      
      
        int
      
       cnt1 = 
      
        0
      
      , cnt2 = 
      
        0
      
      
        ;

        
      
      
        while
      
      
        (l1)

        {

            cnt1
      
      ++; l1 = l1 ->
      
         next;

        }

        
      
      
        while
      
      
        (l2)

        {

            cnt2
      
      ++; l2 = l2 ->
      
         next;

        }

        
      
      
        if
      
       (cnt1 >
      
         cnt2)

        {

            l1 
      
      = headA; l2 =
      
         headB;

            
      
      
        int
      
       tmpcnt1 = cnt1 -
      
         cnt2;

            
      
      
        while
      
      (tmpcnt1-- > 
      
        0
      
      
        )

                l1 
      
      = l1 ->
      
         next;

        }

        
      
      
        else
      
      
        

        {

            l2 
      
      = headB; l1 =
      
         headA;

            
      
      
        int
      
       tmpcnt2 = cnt2 -
      
         cnt1;

            
      
      
        while
      
      (tmpcnt2-- > 
      
        0
      
      
        )

                l2 
      
      = l2 ->
      
         next;

        }

        
      
      
        while
      
      (l1 && l2 && l1 !=
      
         l2)

        {

            l1 
      
      = l1 ->
      
         next;

            l2 
      
      = l2 ->
      
         next;

        }

        
      
      
        if
      
       (l1 ==
      
         l2)

            
      
      
        return
      
      
         l1;

        
      
      
        return
      
      
         NULL;

    }

};
      
    

思路二:

因为两个链表长度可能不一样长,所以不能从第一次走一样的距离判断相交点,但是。可以这样,两个链表同时走,走到末尾后,分别将指针跳到另一个链表的开头,这样,他们第一次相同的点就是答案了。

        
          /*
        
        
          *

 * 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 
        
        *l1 = headA, *l2 =
        
           headB;

        
        
        
          if
        
         (!headA || !headB) 
        
          return
        
        
           NULL;

        
        
        
          while
        
        (l1 &&
        
           l2) 

        {

            l1 
        
        = l1 ->
        
           next;

            l2 
        
        = l2 ->
        
           next;

        }

        

        
        
        
          if
        
         (!
        
          l1)

        {

            l1 
        
        =
        
           headB;

            
        
        
          while
        
        (l1 &&
        
           l2)

            {

                l1 
        
        = l1 ->
        
           next;

                l2 
        
        = l2 ->
        
           next;

            }

            l2 
        
        =
        
           headA;

            
        
        
          while
        
        (l1 && l2 && l1 !=
        
           l2)

            {

                l1 
        
        = l1 ->
        
           next;

                l2 
        
        = l2 ->
        
           next;

            }

        }

        

        
        
        
          else
        
        
          

        {

            l2 
        
        =
        
           headA;

            
        
        
          while
        
        (l1 &&
        
           l2)

            {

                l1 
        
        = l1 ->
        
           next;

                l2 
        
        = l2 ->
        
           next;

            }

            l1 
        
        =
        
           headB;

            
        
        
          while
        
        (l1 && l2 && l1 !=
        
           l2)

            {

                l1 
        
        = l1 ->
        
           next;

                l2 
        
        = l2 ->
        
           next;

            }

        }

        
        
        
          if
        
         (l1 !=
        
           l2)

            
        
        
          return
        
        
           NULL;

        
        
        
          return
        
        
           l1;

    }

};
        
      
View Code

 

leetcode[160] Intersection of Two Linked Lists


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论