美文网首页
单链表的公共结点问题

单链表的公共结点问题

作者: 春天还没到 | 来源:发表于2017-12-07 17:12 被阅读0次

声明: 本总结仅为个人学习总结,以防止遗忘而作,不得转载和商用。
题目:给定两个单向链表,计算两个链表的第一个公共结点,若没有公共节点,返回空
令两链表的长度为m,n,不妨认为m>=n,由于两个链表从第一个公共结点到链表的尾结点是完全重合的.所以前面的(m-n)个结点一定没有公共结点
算法:先分别遍历两个链表得到它们的长度m,n.长链表空转(m-n)次,同步遍历两链表,直至找到相同结点或到链表结束
时间复杂度O(m+n)
Java版本实现:

public static Node findFirstSameNode(Node pA, Node pB){
        //因为有头指针,所以指向第一个有效结点
        pA = pA.next;
        pB = pB.next;
        //计算两个链表的长度
        int nA = calcLength(pA);
        int nB = calcLength(pB);
        if (nA > nB) {//保证后面nB-nA > 0
            Node tempNode = pA;
            pA = pB;
            pB = tempNode;
            
            int temp = nA;
            nA = nB;
            nB = temp;
        }
        //空转nB-nA次
        for(int i=0;i<nB-nA;i++){
            pB = pB.next;
        }
        //齐头并进
        while(pA != null){
            if (pA.value == pB.value) {
                return pA;
            }
            pA = pA.next;
            pB = pB.next;
        }
        return null;
    }

测试代码:

        int pAData[] = {10,34,68,98,20,8,7,6};
        Node pA = new Node(0);
        for(int i=pAData.length-1;i>=0;i--){
            Node node = new Node(pAData[i]);
            node.next = pA.next;
            pA.next = node;
        }
        printLinkedList(pA);
        
        int pBData[] = {21,5,8,7,6};
        Node pB = new Node(0);
        for (int i = pBData.length-1; i>=0;i--) {
            Node node = new Node(pBData[i]);
            node.next = pB.next;
            pB.next = node;
        }
        printLinkedList(pB);
        Node findNode = findFirstSameNode(pA, pB);
        printLinkedList(findNode);

返回结果:
Linked List: 0->10->34->68->98->20->8->7->6->
Linked List: 0->21->5->8->7->6->
Linked List: 8->7->6->

相关文章

  • 单链表的公共结点问题

    声明: 本总结仅为个人学习总结,以防止遗忘而作,不得转载和商用。题目:给定两个单向链表,计算两个链表的第一个公共结...

  • 链表头结点存在的意义

    转载:单链表为什么要设置头结点 问题:在单链表中使用“头结点”,这个哑结点始终是链表的第一个元素,这个技巧的利与弊...

  • 单链表头节点的作用

    转载:小星雪单链表为什么要设置头结点 问题:在单链表中使用“头结点”,这个哑结点始终是链表的第一个元素,这个技巧的...

  • 剑指offer 面试题37:两个链表的第一个公共结点

    题目:输入两个单链表,找出它们的第一个公共结点。链表结点定义如下: 解法一:先求得两个链表的长度m、n,让长的链表...

  • 线性表元素插入和删除

    单链表(链式存储结构)插入 单链表(链式存储结构)删除 有头结点的单链表在开始结点前插入元素等同在头结点后插入元素...

  • 链表基本操作

    1、删除单链表节点 2、插入单链表结点 单链表具体实现

  • 单链表的操作

    单链表代码定义 单链表的操作 初始化单链表 插入结点 注: L为插入的单链表,node为将要插入的结点 前插法 尾...

  • 单链表-带头结点

    带头结点的单链表是指,在单链表的首元结点之前增加一个特殊的结点,称为头结点。头结点的作用:使所有链表(包括空表)的...

  • 【剑指Offer】036——两个链表的第一个公共结点(链表)

    题目描述 输入两个链表,找出它们的第一个公共结点。 解题思路 如果两个链表存在公共结点,那么它们从公共结点开始一直...

  • 剑指Offer-两个链表的第一个公共结点

    描述: 输入两个链表,找出它们的第一个公共结点;注:链表为单链表 法一: 分析: 使用双重循环,依次遍历pHead...

网友评论

      本文标题:单链表的公共结点问题

      本文链接:https://www.haomeiwen.com/subject/ewhjixtx.html