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;
}

一定要记到骨髓里面去。

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

  1. c++ 链表_剑指offer系列——52. 两个链表的第一个公共结点

    题目链接门 两个链表的第一个公共结点_牛客网​www.nowcoder.com 题目描述 输入两个链表,找出它们的第一个公共结点.(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保 ...

  2. 剑指 Offer II 023. 两个链表的第一个重合节点

    题目:给定两个单链表的头节点 headA 和 headB ,请找出并返回两个单链表相交的起始节点.如果两个链表没有交点,返回 null . 思路:想办法把两个链表右对齐,这样从右往左最后一个相同节点就 ...

  3. 剑指offer之求两个数之和(不能使用四则运算)

    1 题目 剑指offer之求两个数之和(不能使用四则运算) 2 代码实现 #include<stdio.h>int add(int num1, int num2) {int sum1;in ...

  4. 【LeetCode】剑指 Offer 52. 两个链表的第一个公共节点

    [LeetCode]剑指 Offer 52. 两个链表的第一个公共节点 文章目录 [LeetCode]剑指 Offer 52. 两个链表的第一个公共节点 一.双指针 一.双指针 设 "第一个 ...

  5. 剑指 Offer 52. 两个链表的第一个公共节点

    题目:剑指 Offer 52. 两个链表的第一个公共节点 ,哈哈,我们今天来看一道很简单的题嘛,这是选自剑指 Offer 上的一道题,好了,我们一起来看看题意吧: 考虑到直接复制题目,或者截屏的方式不 ...

  6. 剑指Offer面试题:31.两个链表的第一个公共节点

    一.题目:两个链表的第一个公共节点 题目:输入两个链表,找出它们的第一个公共结点. 链表结点定义如下,这里使用C#语言描述: public class Node{public int key;publ ...

  7. LeetCode-剑指 Offer 52. 两个链表的第一个公共节点

    剑指 Offer 52. 两个链表的第一个公共节点 思路一:用set容器,不符合题意 /*** Definition for singly-linked list.* struct ListNode ...

  8. 求两个链表的第一个公共结点各种情况及三种思路分析

    转自:http://blog.csdn.net/ssopp24/article/details/72377184 1.寻找两个链表的第一个公共结//这道题可以有很多种思路, 我们按照, 有坏到好的顺序 ...

  9. 数据结构与算法--两个链表中第一个公共节点

    链表中第一个公共节点 公节点定义:同一个节点在两个链表中,并不是节点值相同 题目:输入两个节点,找出他们的第一个公共节点,节点定义如需 /*** 链表元素节点** @author liaojiamin ...

最新文章

  1. Grub及内核的简单介绍安装
  2. 寒冰linux视频教程笔记5 过滤器、输入输出及管道
  3. golang中的new和make的区别
  4. 【Python整蛊合集】多份整蛊代码,发给朋友之后我.....(友尽系列推荐)
  5. mysql数据备份在哪里_mysql之数据备份与恢复
  6. Java Web 项目SSO实战
  7. android4.4安全性,[原创]Android第二代加固(support 4.4-8.1)
  8. 使用runtime跳转界面
  9. 台式计算机怎么安装无线信号接收器,电脑wifi接收器怎么用
  10. 十六进制转二进制c语言程序,c语言中十六进制转为二进制
  11. wallhaven.cc网站图片超清壁纸爬虫
  12. php cnzz api demo,PHP curl抓取cnzz统计数据
  13. 机器人摘果子看图写话_作文:摘苹果(看图写话)
  14. Python字符串杂谈
  15. MSI B450迫击炮装机常见问题解决方法
  16. 013 基于truffle的PetShop案例
  17. POJ 3669(优先队列BFS)(对地图进行优化)
  18. vTPM环境部署(ubuntu)
  19. 熊猫儿 | 燕赵风云,风云燕赵
  20. fp函数式编程_全面了解函数式编程(FP)

热门文章

  1. 30分钟通过Kong实现.NET网关
  2. 小米 华为都要造车?.NET高薪潮来了!(附招聘链接)
  3. AgileConfig-如何使用AgileConfig.Client读取配置
  4. 四种最令人讨厌的编程语言:Java、Javascript、C++和Perl
  5. Dapr微服务应用开发系列0:概述
  6. 慎用ToLower和ToUpper,小心把你的系统给拖垮了
  7. 《ASP.NET Core 微服务实战》-- 读书笔记(第12章)
  8. 冰雪奇缘,白色世界:四个IT人的四姑娘山双桥沟游记
  9. 小白开学Asp.Net Core《四》 —— 使用AspectCore-Framework
  10. 教你自制.NET Core Global Tools