【中级算法】9.相交链表

题目:

编写一个程序,找到两个单链表相交的起始节点。

例如,下面的两个链表:

A:          a1 → a2

                     c1 → c2 → c3

B:     b1 → b2 → b3
在节点 c1 开始相交。

注意:

如果两个链表没有交点,返回 null.
在返回结果后,两个链表仍须保持原有的结构。
可假定整个链表结构中没有循环。
程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。

  解题算法:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    int lengthList(struct ListNode *head){
        int count = 0;

        if(head == NULL){
            return 0;
        }

        while(head){
            head = head->next;
            count++;
        }

        return count;
    }

    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        int l1 = lengthList(headA);
        int l2 = lengthList(headB);
        ListNode * node1 = NULL;
        ListNode * node2 = NULL;

        if(headA == NULL || headB == NULL){
            return NULL;
        }

        if(l1 > l2){
            while(l1!=l2){
                headA = headA->next;
                l1--;
            }
        }

        if(l1 < l2){
             while(l1!=l2){
                headB = headB->next;
                l2--;
            }
        }

        while(headA->next&&headB->next&& headA!=headB){
            headA = headA->next;
            headB = headB->next;
        }

        if(headA!=headB){
            return NULL;
        }else{
            return headA;
        }
    }
};

  

原文地址:https://www.cnblogs.com/mikemeng/p/9206964.html

时间: 2024-10-30 11:10:05

【中级算法】9.相交链表的相关文章

算法题——翻转链表中的一段

题目:给出一个链表中的两个指针p1和p2,将其之间的结点翻转. 思路:可以通过交换结点内的值来实现结点的翻转,空间为O(N):如果要求不能交换值,那么仅凭p1和p2是无法翻转的,只能交换两个指针之间的链表. 代码: 交换值: 1 struct ListNode 2 { 3 int val; 4 ListNode *next; 5 }; 6 7 void reverseNodes(ListNode *p1, ListNode *p2) { 8 if ( p1 == NULL || p2 == NU

编程算法 - 两个链表的第一个公共结点 代码(C)

两个链表的第一个公共结点 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入两个链表, 找出它们的第一个公共结点. 计算链表的长度, 然后移动较长链表的指针, 使其到相同结点的距离的相同, 再同时移动两个链表的指针, 找到相同元素. 时间复杂度: O(n) 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #i

java数据结构与算法之双链表设计与实现

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/53047590 出自[zejian的博客] 关联文章: 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??上一篇文章分析顺序表和单链表,本篇就接着上篇继续聊链表,在单链表

数据结构与算法JavaScript (三) 链表

数据结构与算法JavaScript (三) 链表 我们可以看到在javascript概念中的队列与栈都是一种特殊的线性表的结构,也是一种比较简单的基于数组的顺序存储结构.由于 javascript的解释器针对数组都做了直接的优化,不会存在在很多编程语言中数组固定长度的问题(当数组填满后再添加就比较困难了,包括添加删除, 都是需要把数组中所有的元素全部都变换位置的,javascript的的数组确实直接给优化好了,如 push,pop,shift,unshift,split方法等等…) 线性表的顺序

一步一步写算法(之链表排序)

原文:一步一步写算法(之链表排序) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 相比较线性表的排序而言,链表排序的内容稍微麻烦一点.一方面,你要考虑数据插入的步骤:另外一方面你也要对指针有所顾虑.要是有一步的内容错了,那么操作系统会马上给你弹出一个exception.就链表的特殊性而言,适合于链表的排序有哪些呢? (1)插入排序    (适合) (2)冒泡排序    (适合) (3)希尔排序    (适合) (4)选择排序    (适

一步一步写算法(之链表逆转)

原文:一步一步写算法(之链表逆转) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 链表逆转是面试环境中经常遇到的一道题目,也是我们在实际开发中可能会遇到的开发需求.和线性逆转不一样,单向链表的节点需要一个一个进行处理.为了显示两者之间的区别,我们分别对线性内存和链表进行逆转: (1)普通连续内存数据的反转分析 STATUS normal_revert(int array[], int length) { int* pData ; int

一步一步写算法(之链表重合)

原文:一步一步写算法(之链表重合) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 链表重合是一个好玩的问题.原题目是这样的:有两个链表,那么如何判断这两个链表是不是重合的?至于这个链表在什么时候重合的,这不重要,关键是判断这个链表究竟有没有重合.究竟有什么方法呢? 最简单的方法就是查看两者有没有共同点.那么依次判断就行了. int find_node_in_link(LINK_NODE* pLink, LINK_NODE* pNode)

链表插入和删除,判断链表是否为空,求链表长度算法的,链表排序算法演示——C语言描述

关于数据结构等的学习,以及学习算法的感想感悟,听了郝斌老师的数据结构课程,其中他也提到了学习数据结构的或者算法的一些个人见解,我觉的很好,对我的帮助也是很大,算法本就是令人头疼的问题,因为自己并没有学习过算法的系统性的课程,现在还是处于不断摸索的阶段,好多算法题目根本就没有什么思路,导致自己对好多题目都很是头疼,就算是自己做过的一些算法的题目,再次遇到也还是不一定会做出来,他给出的建议就是,看懂别人的程序,然后自己去敲,一定会出错,然后调试,有错误接着调试,一直到没有错误为止,并且要时常的去复习

算法实例_链表结构 By:比方

前一章,我们说到了顺序表结构,而顺序表也存在一些的缺点. 在插入或者删除节点的时候,需要移动的数据比较大,如果顺序表结构比较大,有时候比较难以分配足够的连续存储空间,可能会导致内存分配失败,而导致无法存储. 而今天我们讲解的链表结构则可以很好的解决这个问题,链表的结构是一种动态存储分配的结构形式,可以根据需要动态申请所需的内存单元. 一.什么是链表结构? a)         我们用head来表示头节点. b)         数据部分保存的是存储的数据,地址地方指向下一个数据的起始部分,依次向

FreeCodeCamp( FCC)前端工程师 中级算法练习 分析与解答(全)(精)

[TOC] 说在前面 这是要一篇非常简单的新手能看懂的文章,希望你喜欢.由于在 freecodecamp 中貌似!?无法使用 ES6 的某些语法,未测试具体.所以基本上用古老?!的ES5,4写成,谢谢.在写本博文前没有参考过别人的做法,纯手打,我的方法肯定不是最好,只是以我自己喜欢的方式在写而已. 纯原创,转载请联系作者https//:[email protected].[email protected]. freecodecamp China 不明白API请参考MDN给出的解释 个别题目没有判