题目描述

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

这题目是指针相关的题目。初步要判断出来,有公共节点的两个指针,应当是链表后半部分相同。这样的话,当遇到第一个相同节点(不是node的val相同,而是node完全相同),则找到了结果。

网上找到一种很简介的写法。稍微分析了下,其实就是将两个链表L1和L2进行了拼接,得到L1+L2和L2+L1两个拼接结果。这两个长度相同,那么one node by one node做判断就好了。

struct ListNode{
int val;
struct ListNode* next;
ListNode(int x) :val(x), next(NULL){
}
}; class Solution_8{
public:
ListNode* FindFirstCommonNode(ListNode* pHead1, ListNode* pHead2){
ListNode* p1 = pHead1;
ListNode* p2 = pHead2;
while (p1 != p2){ if (p1 == NULL){
cout << "p1 is NULL";
}
else{
cout << "p1 is " << p1->val;
}
cout << ", ";
if (p2 == NULL){
cout << "p2 is NULL";
}
else{
cout << "p2 is " << p2->val;
}
cout << endl; p1 = (p1 == NULL ? pHead2 : p1->next);
p2 = (p2 == NULL ? pHead1 : p2->next);
}
return p1;
}
};

第一眼看到这么短的代码不敢相信答案是对的。然后手动试着模拟运行了几个样例,发现是没有问题的。

第一种情况:有相同节点

L1:1 2 3 4 5

L2:3 4 5

因为两个链表每次都是移动一个步长,尽管两个链表长度往往不一样,但是L1拼接L2、L2拼接L1,这两种拼接后的链表长度是一致的,就很容易发现相同节点了。

第二种情况:没有相同节点

那么上一种情况的做法,会使得最终找到的节点是NULL,也就是分别到了“拼接后的链表尾部”。

测试一下吧:

int main_Solution_8_1(){
ListNode* n1 = new ListNode(1);
ListNode* n2 = new ListNode(2);
ListNode* n3 = new ListNode(3);
ListNode* n4 = new ListNode(4);
ListNode* n5 = new ListNode(5);
n1->next = n2;
n2->next = n3;
n3->next = n4;
n4->next = n5; Solution_8 s = Solution_8();
ListNode* res = s.FindFirstCommonNode(n1, n2);
cout << res->val << endl;
return 0;
} int main_Solution_8_2(){
ListNode* n1 = new ListNode(1);
ListNode* n2 = new ListNode(2);
ListNode* n3 = new ListNode(3);
ListNode* n4 = new ListNode(4);
ListNode* n5 = new ListNode(5);
ListNode* n6 = new ListNode(6);
ListNode* n7 = new ListNode(7);
n1->next = n2;
n2->next = n3; n4->next = n5;
n5->next = n6;
n6->next = n7; Solution_8 s = Solution_8();
ListNode* res = s.FindFirstCommonNode(n1, n4);
if (res != NULL){
cout << res->val << endl;
}
else{
cout << "res is NULL " << endl;
}
return 0;
} int main(){
main_Solution_8_2();
return 0;
}

《剑指offer》-链表的第一个公共节点的更多相关文章

  1. 剑指 Offer 52. 两个链表的第一个公共节点 + 链表 + 第一个公共结点 + 双指针

    剑指 Offer 52. 两个链表的第一个公共节点 Offer_52 题目详情 题解分析 可以使用两个指针 node1,node2 分别指向两个链表 headA,headB 的头结点,然后同时分别逐结 ...

  2. 【剑指offer】52. 两个链表的第一个公共节点

    剑指 Offer 52. 两个链表的第一个公共节点 知识点:链表: 题目描述 输入两个链表,找出它们的第一个公共节点. 如下面的两个链表: 示例 示例1: 输入:intersectVal = 8, l ...

  3. 力扣 - 剑指 Offer 52. 两个链表的第一个公共节点

    题目 剑指 Offer 52. 两个链表的第一个公共节点 思路1(栈) 若两个链表相遇,则从它开始相遇的地方到链表末尾应该都是相同的,那么我们可以将两个链表分别放入两个栈中,然后依次循环比较两个栈顶的 ...

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

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

  5. 剑指offer-第五章优化时间和空间效率(两个链表的第一个公共节点)

    思路1:要求的是两个链表的第一个公共节点,首先想到的是用栈来存放两个链表,然后依次从栈中抛出,直到最后一个相同的节点为止.但是要用到两个栈,空间复杂度为O(n): 思路2:从头到尾分别遍历两个链表得到 ...

  6. 剑指offer-面试题52-两个链表的第一个公共节点-链表

    /* 题目: 求两个链表的第一个公共节点. */ /* 思路: 见代码. */ #include<iostream> #include<cstring> #include< ...

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

    题目链接 https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?tpId=13&tqId=11189&t ...

  8. 剑指offer 面试题52. 两个链表的第一个公共节点

    这题之前leetcode做过,权当复习 首先这题没说是否一定有公共节点,如果代码可能因为这一点造成死循环的,需要提前验证所给两个链表是否有公共节点. 方法1:对于每一个list1的节点,遍历list2 ...

  9. 【剑指Offer】面试题52. 两个链表的第一个公共节点

    题目 输入两个链表,找出它们的第一个公共节点. 如下面的两个链表: 在节点 c1 开始相交. 示例 1: 输入:intersectVal = 8, listA = [4,1,8,4,5], listB ...

  10. 每日一题 - 剑指 Offer 52. 两个链表的第一个公共节点

    题目信息 时间: 2019-07-03 题目链接:Leetcode tag: 单链表 难易程度:简单 题目描述: 输入两个链表,找出它们的第一个公共节点. 示例: A: a1 -> a2 \ - ...

随机推荐

  1. Java语法总结--Java集合类

    这一节我们来总结一下Java集合类. Java集合总结 继承与Collection接口的–List接口 List接口本身的特点 常见的继承List接口的实用类 实用类对比 继承与Collection接 ...

  2. Hadoop记录-MRv2(Yarn)运行机制

    1.MRv2结构—Yarn模式运行机制 Client---客户端提交任务 ResourceManager---资源管理 ---Scheduler调度器-资源分配Containers ----在Yarn ...

  3. 详细解读Jquery各Ajax函数:$.get(),$.post(),$.ajax(),$.getJSON()【转】【补】

    一,$.get(url,[data],[callback]) 说明:url为请求地址,data为请求数据的列表(是可选的,也可以将要传的参数写在url里面),callback为请求成功后的回调函数,该 ...

  4. Windows环境墙内搭建Go语言集成开发环境

    1 安装go环境 太简单略 2 安装vs code 找到微软的官方网站,下载Visual Studio Code,官网地址https://code.visualstudio.com/ 安装完成后进入V ...

  5. 机器学习课程-第7周-支持向量机(Support Vector Machines)

    1. 优化目标 在监督学习中,许多学习算法的性能都非常类似,因此,重要的不是你该选择使用学习算法A还是学习算法B,而更重要的是,应用这些算法时,所创建的大量数据在应用这些算法时,表现情况通常依赖于你的 ...

  6. datetimepicker bootstrap的时间插件显示位置问题及其他配置

    位置问题: 在bootstrap中用 datetimepicker 时默认是在输入框下面弹出的, 但是遇到输入框在屏幕最下面时,日期选择框会有一部分在屏幕下面,显示不了,因此需要能够从上面弹出. 可以 ...

  7. FastReport报表打印总页数的问题?

    设置两次报表后加入引号内内容 "第[Page#]页 共[TotalPages#]页" 本站文章除注明转载外,均为本站原创或翻译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果 ...

  8. luogu 1064 金明的预算方案

    01背包 变形,有主附件的背包内则更改决策 original: 1) 不选   2)选,f[j-w[i]]+v[i] now :     1)不选   2)选主   3)主 附1  4)主 附2   ...

  9. cocos2d-x 2.1.4 项目配置过程

    http://cocos2d-x.org 下载cocos2d-x 2.1.4 使用project-creator.py脚本创建Cocos2d-win32 Application项目 1.先下载Wind ...

  10. CF875D High Cry

    传送门 题目要求合法的区间个数,这里考虑用总区间个数减去不合法的个数 假设某个数为区间最大值,那么包含这个数的最长区间内,所有数小于他并且所有数没有这个最大值没有的二进制位,可以按位考虑每个数\(i\ ...