题目描述

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

这题目是指针相关的题目。初步要判断出来,有公共节点的两个指针,应当是链表后半部分相同。这样的话,当遇到第一个相同节点(不是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;
}

最新文章

  1. C# 知识特性 Attribute
  2. git pull push 不用输入用户名和密码的方法
  3. PHP 解析 ElasticSearch 的 json 方法,有關遍歷所有 json 元素
  4. 百度地图api简单使用方法
  5. LoadRunner中取Request、Response
  6. ZOJ 3545 Rescue the Rabbit(AC自动机+状压DP)(The 2011 ACM-ICPC Asia Dalian Regional Contest)
  7. bzoj 2428: [HAOI2006]均分数据
  8. Android HTTPS(2)HttpURLConnection.getInputStream异常的原因及解决方案
  9. 编译boost python模块遇到的错误:../../libraries/boost_1_44_0/boost/python/detail/wrap_python.hpp:75:24: fatal error: patchlevel.h: No such file or directory
  10. CSS3六边形
  11. .Net开源oss项目进度更新(含小程序接口)
  12. 从flexible.js引入高德地图谈起的移动端适配
  13. MySQL 5.7 新特性之初始化
  14. springboot AOP全局拦截日志记录
  15. windows下实现定时重启Apache与MySQL方法
  16. 2017CS231n学习笔记——计算机视觉的概述
  17. django模板继承
  18. html A标签 绑定点击事件。跳转页面。处理
  19. ADO五大对象(转载)
  20. JavaSE日常笔记汇总

热门文章

  1. thread join和detach的区别
  2. Kafka 0.10问题点滴
  3. Hive记录-Hive调优
  4. Hive记录-Hive介绍(转载)
  5. xml/map转换器,递归设计思路【纯原】
  6. C++内存管理(转)http://www.cnblogs.com/qiubole/archive/2008/03/07/1094770.html
  7. js scroll函数
  8. 发现一sonar-runner bug
  9. Java并发编程(1)-Java内存模型
  10. 【BARTS计划】【Share_Week1】社交产品思考