查找两个链表的交叉节点

1. 问题描述

  给定两个单链表,查找这两个单链表的交叉节点。例如:链表listA为:a1→a2→c1→c2→c3,链表listB为:b1→b2→b3→c1→c2→c3。那么这两个的第一个交叉节点为c1。


2. 方法与思路

  首先,观察一下交叉节点的特点。如果两个链表有交叉节点的话,那么这个交叉节点之后的其他节点都是相同的,也就是说两个链表的结构应该是Y字型的。

  

  

  也就是说,c1之后的节点都是交叉节点。下面的问题就是如何确定c1这个节点,我们可以设两个指针分别遍历两个链表,然后对比节点的值,但是两个链表可能是不等长的,我们可以先让长度较大的链表指针先走|len(listA)?len(listB)|步,然后在同步进行。

  时间复杂度O(n),空间复杂度O(1)。

  c++代码如下:

  

    //求出链表长度
    int getListLength(ListNode *head)
    {
        int len = 0;
        ListNode *tmp = head;
        while(tmp) tmp = tmp->next,len++;

        return len;
    }
    //判断交叉节点
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode *a = headA, *b = headB;

        int ab  = getListLength(a)-getListLength(b);

        if(ab > 0)
        {
            while(ab) a = a->next, ab--;
        }
        else if(ab < 0)
        {
            while(ab) b = b->next, ab++;
        }

        while(a && b)
        {
            if(a->val == b->val) return a;

            a = a->next;
            b = b->next;
        }

        return NULL;
    }

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-03 05:22:18

查找两个链表的交叉节点的相关文章

lintcode 中等题:Intersection of Two Linked Lists 两个链表的交叉

题目 两个链表的交叉 请写一个程序,找到两个单链表最开始的交叉节点. 样例 下列两个链表: A: a1 → a2 c1 → c2 → c3 B: b1 → b2 → b3 在节点 c1 开始交叉. 注意 如果两个链表没有交叉,返回null. 在返回结果后,两个链表仍须保持原有的结构. 可假定整个链表结构中没有循环. 挑战 需满足 O(n) 时间复杂度,且仅用 O(1) 内存. 解题 尝试用时间复杂度是O(NM),却没有解决,在这个博客看到根据两个链表的特性进行解决. 就如同上图,两个链表相交的部

10.两个链表的交叉

题目:请写一个程序,找到两个单链表最开始的交叉节点. 注意事项 如果两个链表没有交叉,返回null. 在返回结果后,两个链表仍须保持原有的结构. 可假定整个链表结构中没有循环. /** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solu

【LeetCode每天一题】 Intersection of Two Linked Lists(两个链表的入口节点)

Write a program to find the node at which the intersection of two singly linked lists begins. For example, the following two linked lists: begin to intersect at node c1. Example 1: Input: intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5],

判断两个链表是否相交;查找两个链表的第一个公共节点

问题一:(引用编程之美)如果两个链表相交,则尾节点一定是公共的 问题二: 1 int listLength(node* list){ 2 int length=0; 3 while(list!=NULL){ 4 length++; 5 list=list->next; 6 } 7 return length; 8 } 9 // 10 node* firstComNode(node* list1,node* list2){ 11 int n1=listLength(list1); 12 int n

C++算法之 找出两个链表的公共节点

题目:输入两个链表,找出它们第一个公共节点.链表节点定义如下: struct ListNode { int    m_nKey; ListNode*   m_pNext; } 方法1:在第一个链表上顺序遍历每一个节点,没遍历一个节点,在第二个链表上顺序遍历每个节点.  O(n^2) 方法2:找到两个链表的长度差,先遍历长链表到短链表的长度处,然后两个链表同时遍历,没遍历依次比较两个节点指针是否相同, 注意是比较节点指针,不是节点的值! 代码: // FindFirstCommandNode.cp

LintCode之两两交换链表中的节点

题目描述: 我的思路: 由题目描述可知,题目是要求将第一个与第二个节点,第三个与第四节点....进行交换,而进行交换时只用将节点的值进行交换即可.需要注意的是:当链表为null或者当链表只有一个节点时就没有可进行交换的另一个节点,就可以直接将该链表返回. 我的代码: 1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNod

24. 两两交换链表中的节点

知乎ID: 码蹄疾 码蹄疾,毕业于哈尔滨工业大学. 小米广告第三代广告引擎的设计者.开发者: 负责小米应用商店.日历.开屏广告业务线研发:主导小米广告引擎多个模块重构: 关注推荐.搜索.广告领域相关知识; 题目 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3.说明: 你的算法只能使用常数的额外空间.你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 分析 两两合并节点,头结点

Leetcode篇:两两交换链表中的节点

@author: ZZQ @software: PyCharm @file: swapPairs.py @time: 2018/10/20 19:49 说明:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. 说明: 你的算法只能使用常数的额外空间. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 思路: 四个节点,分别记录当前需要进行交换的两个节点(first, seco

链表-LeetCode24两两交换链表中的节点

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. 说明: 你的算法只能使用常数的额外空间. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 分析:类似于数组中的链表交换,题目中的head是实际的第一个带值的节点,而不是空头节点,由于不能出现空指针,所以,可以创建一个值为0的头结点. /** * Definition for singly-linked list. * st