zoukankan      html  css  js  c++  java
  • 两个链表的第一个公共结点

    offer_36

    概要:两个链表的第一个公共结点

    题目描述

    输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方 式显示的,保证传入数据是正确的)

    链表形式类似于下面这样(这种是有交点的情况):

    思路

    让指向长的链表的指针领先走链表长度差值的步数,这样可以使两指针同时到达链表尾部,如果找到公共结点,返回即可。

    用两个指针,分别指向两个链表头部,同时往后走,当其中一个走到链表尾时,则令其指向另一个链表头。另一个链表也是如此,走到链表尾时,也指向另一个链表头。此时已满足领先要走步数要求。

    ①P1、P2分别指向pHead1、pHead2链表头部;

    ②P1、P2向后走m步,此时P1指向pHead1尾部;

    ③使P1指向pHead2头部;

    ④P2指向pHead2尾部;

    ⑤使P2指向pHead1头部,此时P2在pHead2中已走了m-n步。P1、P2继续向后走,直至找到公共结点,后续两链表长度均为m。

    思路图解:

    思路动图:

    动态图解

    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
            //长度相同有公共结点,第一次就遍历到;没有公共结点,走到尾部NULL相遇,返回NULL
            //长度不同有公共结点,第一遍走完长度的差值就出来了,第二遍一起到公共结点;没有公共,一起到结尾NULL。
            ListNode p1 = pHead1;
            ListNode p2 = pHead2;
            while (p1 != p2) {
                //如果当前结点为 null,就指向另一个链表的头结点开始第二次遍历
                p1 = (p1 == null) ? pHead2 : (p1 = p1.next);
                p2 = (p2 == null) ? pHead1 : (p2 = p2.next);
            }
            return p1;
        }
    

    参考链接 https://blog.csdn.net/qq_38473097/article/details/106835500
    https://blog.csdn.net/ananbei/article/details/80589360

  • 相关阅读:
    无刷电机控制基本原理
    SPI 串行Flash闪存W25Q128FV 的使用(STM32F407)_软件篇
    CAN总线简介
    RS-232串口特性
    PLSQL 安装教程
    JS 常用正则表达式备忘录
    JS数组去重
    Js中Map对象的使用
    JS操作字符串
    前端小技巧
  • 原文地址:https://www.cnblogs.com/SunAlbert/p/13475761.html
Copyright © 2011-2022 走看看