《剑指offer》-链表的第一个公共节点
题目描述
输入两个链表,找出它们的第一个公共结点。
这题目是指针相关的题目。初步要判断出来,有公共节点的两个指针,应当是链表后半部分相同。这样的话,当遇到第一个相同节点(不是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》-链表的第一个公共节点的更多相关文章
- 剑指 Offer 52. 两个链表的第一个公共节点 + 链表 + 第一个公共结点 + 双指针
剑指 Offer 52. 两个链表的第一个公共节点 Offer_52 题目详情 题解分析 可以使用两个指针 node1,node2 分别指向两个链表 headA,headB 的头结点,然后同时分别逐结 ...
- 【剑指offer】52. 两个链表的第一个公共节点
剑指 Offer 52. 两个链表的第一个公共节点 知识点:链表: 题目描述 输入两个链表,找出它们的第一个公共节点. 如下面的两个链表: 示例 示例1: 输入:intersectVal = 8, l ...
- 力扣 - 剑指 Offer 52. 两个链表的第一个公共节点
题目 剑指 Offer 52. 两个链表的第一个公共节点 思路1(栈) 若两个链表相遇,则从它开始相遇的地方到链表末尾应该都是相同的,那么我们可以将两个链表分别放入两个栈中,然后依次循环比较两个栈顶的 ...
- 剑指Offer面试题:31.两个链表的第一个公共节点
一.题目:两个链表的第一个公共节点 题目:输入两个链表,找出它们的第一个公共结点. 链表结点定义如下,这里使用C#语言描述: public class Node { public int key; p ...
- 剑指offer-第五章优化时间和空间效率(两个链表的第一个公共节点)
思路1:要求的是两个链表的第一个公共节点,首先想到的是用栈来存放两个链表,然后依次从栈中抛出,直到最后一个相同的节点为止.但是要用到两个栈,空间复杂度为O(n): 思路2:从头到尾分别遍历两个链表得到 ...
- 剑指offer-面试题52-两个链表的第一个公共节点-链表
/* 题目: 求两个链表的第一个公共节点. */ /* 思路: 见代码. */ #include<iostream> #include<cstring> #include< ...
- [剑指Offer]52-两个链表的第一个公共节点
题目链接 https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?tpId=13&tqId=11189&t ...
- 剑指offer 面试题52. 两个链表的第一个公共节点
这题之前leetcode做过,权当复习 首先这题没说是否一定有公共节点,如果代码可能因为这一点造成死循环的,需要提前验证所给两个链表是否有公共节点. 方法1:对于每一个list1的节点,遍历list2 ...
- 【剑指Offer】面试题52. 两个链表的第一个公共节点
题目 输入两个链表,找出它们的第一个公共节点. 如下面的两个链表: 在节点 c1 开始相交. 示例 1: 输入:intersectVal = 8, listA = [4,1,8,4,5], listB ...
- 每日一题 - 剑指 Offer 52. 两个链表的第一个公共节点
题目信息 时间: 2019-07-03 题目链接:Leetcode tag: 单链表 难易程度:简单 题目描述: 输入两个链表,找出它们的第一个公共节点. 示例: A: a1 -> a2 \ - ...
随机推荐
- javascript 体验定时器
<script> // setInterval():循环定时器,循环执行 // setTimeout():炸弹定时器,只执行一次 //定义方法1:匿名函数 setInterval(func ...
- groovy.lang.GroovyRuntimeException: Conflicting module versions
在运行groovy的junit方法时,报了这个错误: java.lang.ExceptionInInitializerError at org.codehaus.groovy.reflection.C ...
- Linux 命令详解(十一)Shell 解析 json命令jq详解
前言 在自动化部署中涉及到shell脚本需要动态读取很多配置文件,最好是json格式. 更多jq信息: http://stedolan.github.io/jq/manual/ 一.根据key获取va ...
- db.properties文件的配置格式
#加载驱动 mysql.driver=com.mysql.jdbc.Driver #加载数据库 mysql.url=jdbc:mysql://localhost:3306/floor_shop #用户 ...
- VS中修改工程名的解决方案
VS中修改工程名的解决方案: 一.先修改工程名/解决方案名(在VS中修改即可)举例,原先的工程名为OldProject 想要改成NewProject1.找到工程/解决方案所在的文件夹(已工程名/解 ...
- sql 分页row_number() over(order by key)
select * from ( select row_number() over(order by BD008_001) as row ,* from (select * from bd008)t ) ...
- 一个极好的JavaScript学习网址
JavaScript学习网址:https://javascript.info/ 网址界面如下,内容和排版都非常不错,内容也比较新,不像一些教程已经是好几年前的了.把这个教程浏览一遍,能够解答很多看代码 ...
- jira7.3.6添加导出excel的按钮
在 jira的application-data 文件夹下 jira-config.properties 文件(如果没有就创建一个) 中添加以下内容:jira.export.excel.enabled= ...
- servlet相关
servlet是在服务器端运行的一个小程序.一个servlet就是一个java类,并且可以通过“请求-响应”编程模型来访问的这个驻留在服务器内存里的servlet程序. 1.生命周期 2.内置对象 r ...
- D - Laying Cables Gym - 100971D (单调栈)
题目链接:https://cn.vjudge.net/problem/Gym-100971D 题目大意:给你n个城市的信息,每一个城市的信息包括坐标和人数,然后让你找每一个城市的父亲,作为一个城市的父 ...