zoukankan      html  css  js  c++  java
  • 剑指 Offer 52. 两个链表的第一个公共节点

    一、题目描述

    输入两个链表,找出它们的第一个公共节点。

    如下面的两个链表:

    在节点 c1 开始相交。

    示例 1:

    输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
    输出:Reference of the node with value = 8
    输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节

    二、题解

    方法一:计算链表长度

    计算两个链表的长度,计算差值k,让长的链表先走k步,然后一起走

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) {
     *         val = x;
     *         next = null;
     *     }
     * }
     */
    public class Solution {
        public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
            ListNode pA = headA;
            ListNode pB = headB;
            int countA = 0;
            int countB = 0;
            while(pA!=null||pB!=null){
                if(pA!=null){
                    countA++;
                    pA = pA.next;
                }
                if(pB!=null){
                    countB++;
                    pB = pB.next;
                }
            }
            int k = Math.abs(countA-countB);
            if(countA>countB){
                pA = headA;
                pB = headB;
            }else{
                pA = headB;
                pB = headA;
            }
            int count = 0;
            while(pA!=null&&pB!=null){
                if(pA==pB)
                    return pA;
                if(count>=k)
                    pB = pB.next;
                pA = pA.next;
                count++;
            }
            return null;
        }
    }

    方法二:

    链表A的非公共字段长度为a,链表b的非公共字段长度为b,公共长度为c

    a + c + b = b + c + a:即指针pa和指针pb走过相同的步数即可相遇

    class Solution {
    public:
        ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
            ListNode * pa = headA;
            ListNode * pb = headB;
    
            while(pa!=pb){
                pa = pa==nullptr?headB:pa->next;
                pb = pb==nullptr?headA:pb->next;
            }
    
            return pa;
        }
    };
  • 相关阅读:
    -for循环案例(下)
    for循环案例(上)
    for循环
    判断语句案例
    判断语句
    操作符优先级
    windows 下安装图片标注软件 labelling和出错解决
    tf-faster rcnn
    目标检测——Faster R-CNN 详解、Pytorch搭建、训练自己的数据集
    java idea 配置安装
  • 原文地址:https://www.cnblogs.com/ttzz/p/14369836.html
Copyright © 2011-2022 走看看