剑指offer之求两个链表的第一个公共节点

1 问题

输入两个链表,找出它们的第一个公共结点。

含有公共节点的两个链表的结构类似于下图中的链表:

1 -> 2 -> 3 -> 4 ->5

               2 -> 4 ->5

可以看到两个链表中有一个公共节点,其中4节点就是这两个链表的公共节点  

 

 

 

2 分析

既然题目是求公共节点,说明一定存在这个节点,然后我们可以发现两个链表的尾巴是一样,都重合了是Y性结构,我们先把长的链表的头移动到短的头那里,然后一个接着下一个比较就行

 

 

 

 

3 代码实现

#include <stdio.h>
#include <stdlib.h>typedef struct Node
{int value;struct Node *next;
} Node;/** 初始化结构体*/
struct Node* init(struct Node *node, int value)
{node = (struct Node*)malloc(sizeof(Node));if (node != NULL){node->value = value;//这个地方不要忘记设置为NULLnode->next = NULL;return node;}return NULL;
}/** 获取链表的长度*/
int length(Node *head)
{if (head == NULL)return 0;Node *p = head;int length = 0;while (p != NULL){length++;p = p->next;}return length;
}/*** 找到第一个公共的节点*/
struct Node* get_common(Node *head1, Node *head2)
{if (head1 == NULL || head2 == NULL){return NULL;}int list1_length = length(head1);int list2_length = length(head2);Node *short_head = NULL;Node *long_head = NULL;int sub_len = 0;if (list1_length > list2_length){short_head = head2;long_head = head1;sub_len = list1_length - list2_length;}else{short_head = head1;long_head = head2;sub_len = list2_length - list1_length;}//移动长链表,确保两个链表一样长while (sub_len > 0){sub_len--;long_head = long_head->next;}while (short_head != NULL && long_head != NULL){if (short_head->value == long_head->value){return short_head;}short_head = short_head->next;long_head = long_head->next;}return NULL;
}int main()
{Node *n1 = NULL;Node *n2 = NULL;Node *n3 = NULL;Node *n4 = NULL;Node *n5 = NULL;Node *m1 = NULL;Node *m2 = NULL;Node *m3 = NULL;n1 = init(n1, 1);n2 = init(n2, 2);n3 = init(n3, 3);n4 = init(n4, 4);n5 = init(n5, 5);m1 = init(m1, 2);m2 = init(m2, 4);m3 = init(m3, 5);if (n1 && n2 && n3 && n4 && n5){n1->next = n2;n2->next = n3;n3->next = n4;n4->next = n5;}if (m1 && m2 && m3){m1->next = m2;m2->next = m3;}Node *node = get_common(n1, m2);if (node){printf("common node value is: %d\n", node->value);}else{printf("two list do not common value\n");}if (n1) {free(n1); n1 = NULL;}if (n2) {free(n2); n2 = NULL;}if (n3) {free(n3); n3 = NULL;}if (n4) {free(n4); n4 = NULL;}if (n5) {free(n5); n5 = NULL;}if (m1) {free(m1); m1 = NULL;}if (m2) {free(m2); m1 = NULL;}if (m3) {free(m3); m1 = NULL;}return 1;
}

 

 

 

4 运行结果

common node value is: 4

 

 

 

 

5 总结

如果我们求链表的长度,一般是这样的函数

/** 获取链表的长度*/
int length(Node *head)
{if (head == NULL)return 0;Node *p = head;int length = 0;while (p != NULL){length++;p = p->next;}return length;
}

一定要记到骨髓里面去。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288809.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.Net Core 限流控制-AspNetCoreRateLimit

简介AspNetCoreRateLimit是ASP.NET核心速率限制框架&#xff0c;能够对WebApi&#xff0c;Mvc中控制限流&#xff0c;AspNetCoreRateLimit包包含IpRateLimit中间件和ClientRateLimit中间件&#xff0c;每个中间件都可以为不同的场景设置多个限&#xff0c;该框架的作者是stefan…

应用系统日志采集解决方案

概述 基于Flume MongoDB&#xff0c;对现有的多个应用系统进行日志采集。特点 采集范围每一次用户请求的请求信息。数据量大尽量减少现有系统的改动数据流图 说明&#xff1a;首先考虑的结构体系&#xff0c;是直接在应用系统中&#xff0c;将日志数据写到Flume&#xff1b;但…

0x00000001java_「十六进制表示」0x00000001是个啥?32位表示、十六进制表示 - seo实验室...

十六进制表示0x0000 0001首先他是个16进制的数字、8进制的是0开头的、比如 077 他是八进制的、十进制的话就是63、7*87630x0000 0001他表示一个32位的、因为十六进制的一位有16种变化、四位的变化也是16种。那么、想表示32位的数据、需要16进制的bit 0000 0000 0000 0000 0000 …

每个程序员都可能犯过的10个错误

1. 面向编译器写代码&#xff0c;而不是面向用户 当人们使用编译器创建自己的 app 时&#xff0c;在把自己的想法诉诸于机器代码的过程中&#xff0c;常常会将那些可以使得编程更为简单却又冗长的语法遗忘于脑后。 无论你使用的是单字母的标识符还是更易于人脑理解的标识符&…

C#趣味程序---爱因斯坦的台阶问题

问题&#xff1a;设有一阶梯&#xff0c;每步跨2阶&#xff0c;最后余1阶&#xff1b;每步跨3阶&#xff0c;最后余2阶&#xff1b;每步跨5阶&#xff0c;最后余4阶&#xff1b;每步跨6阶&#xff0c;最后余5阶&#xff1b;每步跨7阶&#xff0c;刚好到阶顶&#xff0c;问共有多…

【C语言简单说】十九:二维数组循环嵌套(1)

(▼ _ ▼) 又到了这一节 了&#xff0c;这是痛苦的一节&#xff0c;因为我完全不懂如何像新手说明循环嵌套。。。 因为很多新手理解不了。&#xff0c;我就直接拿我以前的教程复制上来了。 首先先说循环嵌套&#xff1a; 循环嵌套的意思就是循环里面有一个循环&#xff0c;例…

剑指offer之C语言实现链表(两种方式)

1 问题 用C语言实现链表 2 代码实现 #include <stdio.h> #include <stdlib.h>#define true 0 #define false -1typedef struct Node {int value;struct Node *next; } List;/***初始化链表*/ struct Node* init_list() {struct Node *head (struct Node*)malloc…

python数据类型描述_【文山玩Python】用python的数据类型,来简单的描述世界

前文讲过&#xff0c;编程语言是对现实世界的抽象与模拟&#xff0c;那么数据类型就是用来构造模拟现实世界的工具。那么python中的数据类型&#xff0c;在现实生活中可以找到那些原型呢&#xff1f;我们先回顾一个幼儿教育的过程&#xff1a;出生后&#xff0c;我们先教的是什…

Xamarin效果第二十二篇之录音效果

在前面文章中简单玩了玩GIS的基本操作、Mark相关、AR、测距、加载三维白模和可扩展浮动操作;今天抽空再来分享一下录音效果;啥也不说了都在效果里:1、首次尝试了开源的Plugin.AudioRecorder结果发现没效果,也可能是我的姿势不对:https://github.com/NateRickard/Plugin.AudioRe…

@action 注解

下载 注解配置 private String fileName; private String contentType "application/octet-stream"; Action(value "/download", results { Result(name "download", type"stream", params{ "contentType"…

从零开始来看一下Java泛型的设计

引言 泛型是Java中一个非常重要的知识点&#xff0c;在Java集合类框架中泛型被广泛应用。本文我们将从零开始来看一下Java泛型的设计&#xff0c;将会涉及到通配符处理&#xff0c;以及让人苦恼的类型擦除。 泛型基础 泛型类 我们首先定义一个简单的Box类&#xff1a; public c…

6.对象和数组

对象和数组 学习要点&#xff1a;1.Object类型2.Array类型3.对象中的方法 什么是对象&#xff0c;其实就是一种类型&#xff0c;即引用类型。而对象的值就是引用类型的实例。在ECMAScript中引用类型是一种数据结构&#xff0c;用于将数据和功能组织在一起。它也常被称作为类&am…

php json error,PHP 7.3 中的 JSON 错误处理

PHP 7.3 为 json_encode() 和 json_decode() 函数增加的一个新特性使其更好的处理错误。这个特性「 RFC 」以 23 比 0 的投票结果被一致接受。让我们看一看在 PHP 7.2 及一下版本中是如何处理 JSON 错误的&#xff0c;以及 PHP 7.3 中新的改进。背景当前在 PHP7.2 版本中&#…

C#趣味程序---三色球问题

问题&#xff1a;若一个口袋中放有12个球&#xff0c;3红3白和6黑&#xff0c;问从袋中任意取8个球&#xff0c;有多少种不同的颜色搭配&#xff1f; using System;namespace ConsoleApplication1 {class Program{static void Main(string[] args){Console.WriteLine("共有…

剑指offer之C++语言实现链表(两种删除节点方式)

1 问题 用C语言实现链表 2 代码实现 #include <iostream> #include <stdlib.h>using namespace std;class List { public:List();~List();List* createNode(int value);//创建节点bool insertNode(List *node);//插入节点void printList();//打印节点bool delete…

【C语言简单说】十九:二维数组循环嵌套(2)

这节直接用循环嵌套来输出二维数组了&#xff1a; 注&#xff1a;我说的队和列并不是一般说法&#xff0c;我用此比喻好让新手更好理解。 #include<stdio.h> #include<stdlib.h> int main() {int array[2][3]{1,2,3,4,5,6};//第一句 int i,j;//第二句 for(i0;i&l…

C# 11 对 ref 和 struct 的改进

前言C# 11 中即将到来一个可以让重视性能的开发者狂喜的重量级特性&#xff0c;这个特性主要是围绕着一个重要底层性能设施 ref 和 struct 的一系列改进。但是这部分的改进涉及的内容较多&#xff0c;不一定能在 .NET 7&#xff08;C# 11&#xff09;做完&#xff0c;因此部分内…

lia人是什么意思_狗狗喜欢舔人到底什么意思?毛孩的心思主人你要懂

很多人都喜欢养狗&#xff0c;因为它们忠诚、淘气、可爱。同时&#xff0c;狗狗也有很多奇怪的习惯&#xff0c;例如&#xff1a;喜欢舔人&#xff0c;喜欢追逐活动的东西等等。不过大多数狗主人通常都会有一个最想知道的问题&#xff1a;为什么狗狗总喜欢舔人&#xff0c;它们…

UINavigationController

-(void)resetTabbarController:(UITabBarController *)controller { NSArray *arr controller.tabBar.items; UITabBarItem *item0 [arr objectAtIndex:0]; //使用指定图片 [item0 setSelectedImage:[[UIImage imageNamed:"icon_everyday_press"] imageWithRenderi…

“爱思助手”曝为iOS木马:可绕过苹果DRM机制

一款新的iOS木马已在国内曝光&#xff0c;它可以通过PC感染未越狱的iOS设备&#xff0c;而无需利用企业证书。Palo Alto Networks指出&#xff0c;其名叫“爱思助手”(AceDeceiver)&#xff0c;目前正在影响我国的iOS用户。“爱思助手”利用了苹果数字版权管理(DRM)上的FairPla…