两个链表的第一个公共节点
来源:互联网 发布:英语流利说 知乎 编辑:程序博客网 时间:2024/06/05 08:24
题目描述
输入两个链表,找出它们的第一个公共结点。
假定 List1长度: a+n List2 长度:b+n, 且 a<b
那么 p1 会先到链表尾部, 这时p2 走到 a+n位置,将p1换成List2头部
接着p2 再走b+n-(n+a) =b-a 步到链表尾部,这时p1也走到List2的b-a位置,还差a步就到可能的第一个公共节点。
将p2 换成 List1头部,p2走a步也到可能的第一个公共节点。如果恰好p1==p2,那么p1就是第一个公共节点。 或者p1和p2一起走n步到达列表尾部,二者没有公共节点,退出循环。 同理a>=b.
时间复杂度O(n+a+b)
如果有公共节点,两个指针都走 a+b+n步
/*struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}};*/class Solution {public: ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { if(pHead1 == NULL || pHead2 == NULL) return 0; ListNode* p1 = pHead1; ListNode* p2 = pHead2; while(p1!=p2){ if(p1!=NULL) p1 = p1->next; if(p2!=NULL) p2 = p2->next; if(p1!=p2){ if(p1 == NULL) p1 = pHead2; if(p2 == NULL) p2 = pHead1; } } return p1; }};
简化代码:
/*struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}};*/class Solution {public: ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { if(pHead1 == NULL || pHead2 == NULL) return NULL; ListNode* p1 = pHead1; ListNode* p2 = pHead2; while(p1 != p2){ p1 = (p1 == NULL) ? pHead2 : p1->next; p2 = (p2 == NULL) ? pHead1 : p2->next; } return p1; }};
阅读全文
0 0
- 两个链表的公共第一个公共节点
- 找到两个单向链表的第一个公共节点
- 找到两个单向链表的第一个公共节点
- 找到两个单向链表的第一个公共节点
- 两个单向链表的第一个公共节点
- 两个链表的第一个公共节点
- 寻找两个相交链表的第一个公共节点
- 两个链表的第一个公共节点
- 寻找两个相交链表的第一个公共节点
- 寻找两个相交链表的第一个公共节点
- 两个链表的第一个公共节点
- 两个链表的第一个公共节点
- 找出两个链表的第一个公共节点
- (LeetCode)两个链表的第一个公共节点
- 37 - 两个链表的第一个公共节点
- 两个链表的第一个公共节点
- 剑指offer-两个链表的第一个公共节点
- 两个链表的第一个公共节点
- Struts1.2中ActionForm与ValidatorForm、DynaActionForm的区别
- Java基础学习总结(二)—— 面向对象(类和对象)
- Sass 编译与不同风格的输出方式
- eclipse启动tomcat,不能够通过网页访问项目和tomcat主页
- Percona-XtraBackup安装配置
- 两个链表的第一个公共节点
- 硬件设计小说(一):发光二极管的故事
- leetcode[Binary Tree Tilt]//待整理多种解法
- AngualrJS(十三)改变$scope的值
- 线段树模板
- Java I/O
- Java注解(一):注解介绍及自定义注解入门
- spring整合mybatis
- BZOJ 2440-完全平方数(二分答案+莫比乌斯反演)