zoukankan      html  css  js  c++  java
  • 微软面试题:剑指 Offer 52. 两个链表的第一个公共节点 出现次数:2

    题目描述:

     

     思路:

    对上图示例 2,设置两个指针 A_ptr 和 B_ptr ,让A_ptr 初始 指向链表headA头部 (结点 0), B_ptr初始指向链表headB头部(结点3),  

    A_ptr 和 B_ptr同步地向后移动,A_ptr 到结点 0 所在链表尾部后,跳到headB头部(结点 3) 继续遍历,B_ptr到headB尾部后,

    跳到headA头部继续遍历,对于示例 2,A_ptr  和 B_ptr一定会相遇在公共结点2上。

    对于示例三,在A_ptr 和B_ptr 和都遍历完两个链表后,仍然没有相遇,返回 NULL。

    代码如下:

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode(int x) : val(x), next(NULL) {}
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     ListNode *getIntersectionNode(ListNode *headA, ListNode *headB)
    12     {
    13         if(headA == NULL || headB == NULL)
    14         {
    15             return NULL;
    16         }
    17         ListNode *A_ptr = headA;
    18         ListNode *B_ptr = headB;
    19         int num_a = 0;
    20         int num_b = 0;
    21         while(num_a < 2 && num_b < 2)
    22         {
    23             if(A_ptr == NULL)//A_ptr 从headA遍历到尾部后,重新从headB开始遍历
    24             {
    25                 A_ptr = headB;
    26                 ++num_a;
    27             }
    28             if(B_ptr == NULL)//B_ptr 从headB遍历到尾部后,重新从headA开始遍历
    29             {
    30                 B_ptr = headA;
    31                 ++num_b;
    32             }
    33             if(A_ptr == B_ptr )//A_ptr和B_ptr相遇
    34             {
    35                 return A_ptr;
    36             }
    37             //两指针同步后移
    38             A_ptr = A_ptr->next;
    39             B_ptr = B_ptr->next;
    40         }
    41         //两指针都遍历完两个链表后,仍然没有相遇,说明两链表没有公共节点
    42         return NULL;
    43     }
    44 };
  • 相关阅读:
    前端总结挺全面的
    cmd与bat脚本的使用
    Spring控制反转(IoC)的理解
    C# 中迭代器
    URL 分页并排序
    结合Flash上传文件时显示进度条
    C# 语言特性
    where T:new()
    图片缩放特效
    C# 隐藏窗体 ALT+TAb不可见
  • 原文地址:https://www.cnblogs.com/wangxf2019/p/14627435.html
Copyright © 2011-2022 走看看