【32】计算两个链表的公共长度

题目:给定两个链表的头结点,求两个链表的公共长度。

分析:

1. 两个链表无非就两种关系(其它特殊关系都可以看成是这两种的特殊关系)

   (1)不相交:

     

   (2)相交:

       

2. 对于第一种情况,两个链表不相交则公共长度为0。第二种情况是从第一个公共结点之后所有点都是公共的,因此可以求出公共长度。

3. 怎么求两个链表公共长度呢?

    假设链表1的长度为n,链表2的长度为m,并且满足n > m。我们可以设置两个指针p1,p2开始指向链表1和链表2的头结点,并且让p1先走几步使得链表1剩下的长度等于链表2。然后再同时让两个指针p1,p2一起走,判断有没有公共结点,若有从第一个公共结点开始直到链表末尾都是公共结点。

    整个算法的时间复杂度为O(2*(n+m)),所以总的就是O(n)级别。

4. 代码

//链表结点
struct ListNode{
    int value;
    ListNode *nextNode;
};

//求链表的长度
int GetListLength(ListNode *headNode){
    //空链表返回0
	if(headNode == NULL){
	    return 0;
    }
    ListNode *tmpNode = headNode;
	int length = 0;
	while(tmpNode != NULL){
        ++length;
        tmpNode = tmpNode->nextNode;
    }
    return length;
} 

//求两个链表的公共长度
int GetCommonLength(ListNode *headOne, ListNode *headTwo){
    //不合法数据
	if(headOne == NULL || headTwo == NULL){
        return 0;
    }
    //先求出两个链表的长度
	ListNode *tmpHeadOne = headOne;
	ListNode *tmpHeadTwo = headTwo;
	int listOneLength = GetListLength(tmpHeadOne);
	int listTwoLength = GetListLength(tmpHeadTwo);
	//让长的链表先走几步
	if(listOneLength > listTwoLength){
        while(listOneLength > listTwoLength){
	          tmpHeadOne = tmpHeadOne->nextNode;
	          --listOneLength;
	    }
    }
    else{
        while(listTwoLength > listOneLength){
	          tmpHeadTwo = tmpHeadTwo->nextNode;
	          --listTwoLength;
	    }
    }
	//求公共长度
	int commonLength = 0;
    while(tmpHeadOne != NULL && tmpHeadTwo != NULL){
        //指向同一个结点,地址相同
		if(tmpHeadOne == tmpHeadTwo){
            ++commonLength;
        }
        tmpHeadOne = tmpHeadOne->nextNode;
        tmpHeadTwo = tmpHeadTwo->nextNode;
    }
    return commonLength;
}
时间: 2024-10-06 03:26:24

【32】计算两个链表的公共长度的相关文章

找两个链表的公共节点

首先考虑两个链表无环的情况. 将链表a的尾节点指向头节点从而形成环.用快慢指针遍历链表b,一个一次移动2单位,另一个移动1单位.如果不相遇则不存在公共节点.如果相遇,则让其中一个指针指向b,两个指针以1单位/次的速度移动,直到相遇.相遇时指向的节点就是公共节点的起始.最后记得将a的尾节点恢复.代码如下. 其次考虑有环的情况.用快慢指针探测a中是否有环.如果有则,将使p指向a的尾节点,p的next指向null.按照上面的方法遍历b.如果遍历的过程中遇到p,则将p指向a继续遍历.如果未遇到p或者无环

剑指offer系列之三十五:两个链表的第一个公共节点

题目描述 输入两个链表,找出它们的第一个公共结点. 由于是单链表,所以可以发现从第一个公共节点开始,后面的结点都是相同的,一种思路是从两个链表的尾部开始遍历,直到发现最后一个相同的结点为止,那么这最后一个相同的结点是单链表的角度看就是两个链表的第一个公共节点了.还有一种思路是不需要从尾部开始遍历,毕竟从尾部遍历单链表的话还得使用反转链表的方法进行操作,首先计算出两个链表的长度,让更长的那个单链表先移动两个链表长度差值个位置,然后两个链表同时移动,从更短的那个链表的第一个位置开始遍历,两个链表都往

如何求两个链表的第一个公共结点

题目: 输入两个链表, 找出它们的第一个公共结点. 计算链表的长度, 然后移动较长链表的指针, 使其到相同结点的距离的相同, 再同时移动两个链表的指针, 找到相同元素. 时间复杂度: O(n) 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h> #include <stdlib.h> #include <stri

用C语言计算一个单链表的长度,单链表的定义如下:要求使用递归,不得出现循环。

问题描述 用C语言计算一个单链表的长度,单链表的定义如下:要求使用递归,不得出现循环. 用C语言计算一个单链表的长度,单链表的定义如下:要求使用递归,不得出现循环. 解决方案 如果链表有环,永远算不出来 只能假定,这个链表不是环形链表,也没有环 简单事情用递归做是低效率的,即便学习递归,也是不必要的 递推, 可以用递归实现 也可以用迭代实现 前者无循环,后者有 解决方案二: int listLength(List *l) { if(l->next!=NULL) { l=l->next; ret

php计算两个文件相对路径的方法

 本文实例讲述了php计算两个文件相对路径的方法.分享给大家供大家参考.具体如下: 一.问题: 写一个php函数算出两个文件的相对路径.例如$a="/a/b/c/d/e.php"; $b="/a/b/12/34/c.php",B相对于A的相对路径是什么? 二.解决方法: <?php /** * 求$b相对于$a的相对路径 * @param string $a * @param string $b * @return string */ function get

初学者的一点疑问,汇编语言计算两个输入数字的和并输出

问题描述 初学者的一点疑问,汇编语言计算两个输入数字的和并输出 assume cs:code,ds:data data segment buf1 db 20 db ? db 20 dup(?) buf2 db 20 db ? db 20 dup(?) sh1 db "please input tow numbers$" sh2 db 0ah,0dh,"The first number is $" sh3 db 0ah,0dh,"The second num

php计算两个文件相对路径的方法_php技巧

本文实例讲述了php计算两个文件相对路径的方法.分享给大家供大家参考.具体如下: 一.问题: 写一个php函数算出两个文件的相对路径.例如$a="/a/b/c/d/e.php"; $b="/a/b/12/34/c.php",B相对于A的相对路径是什么? 二.解决方法: <?php /** * 求$b相对于$a的相对路径 * @param string $a * @param string $b * @return string */ function getR

php计算两个经纬度地点之间的距离

php计算两个指定的经纬度地点之间的距离,这个在做计算给定某个地点的经纬度,计算其附近的商业区,以及给定地点与附近各商业区之间的距离的时候,还是用的到的.下面是具体的函数代码以及用法示例. 关于如何获取某个地址的经纬度,可参照本站文章: 谷歌地图第三版根据地理位置获取经纬度的方法 <?php /** *求两个已知经纬度之间的距离,单位为米 *@param lng1,lng2 经度 *@param lat1,lat2 纬度 *@return float 距离,单位米 *@author www.Al

坐标距离计算:php 计算 两个坐标之间的距离

<?php  define('EARTH_RADIUS', 6378.137);//地球半径  define('PI', 3.1415926);  /**  * 计算两组经纬度坐标 之间的距离  * params :lat1 纬度1: lng1 经度1: lat2 纬度2: lng2 经度2: len_type (1:m or 2:km);  * return m or km  */  function GetDistance($lat1, $lng1, $lat2, $lng2, $len_t