Leetcode 160 寻找两链表的交叉节点
来源:互联网 发布:js给input文本框赋值 编辑:程序博客网 时间:2024/06/08 08:28
问题:
160.Intersection of Two Linked Lists
思想:
解法一:
第一遍循环,找出两个链表的长度差N
第二遍循环,长链表先走N步,然后同时移动,判断是否有相同节点
解法二:
链表到尾部后,跳到另一个链表的头部, 相遇点即为intersection points.
解释:
- 保持两个指针pA和pB分别在A和B的头部初始化。然后让他们一次遍历列表,一个节点。
- 当pA到达列表的末尾时,然后将其重定向到B的头部(是的,B,那是正确的)。类似地,当pB到达列表的末尾时,重定向到A的头部。
- 如果在任何点pA满足pB,则pA / pB是交点节点。
- 为了了解上述技巧为什么会起作用,请考虑以下两个列表:A = {1,3,5,7,9,11}和B = {2,4,9,11},它们在节点'9 '。由于B.length(= 4)<A.length(= 6),pB将首先到达合并列表的末尾,因为pB正好穿过2个小于pA的节点。通过将pB重定向到头A,将pA重定向到头B,我们现在要求pB比pA更精确地传送2个节点。所以在第二次迭代中,它们保证同时到达交点节点。
- 如果两个列表有交集,那么它们的最后一个节点必须是相同的。所以当pA / pB到达列表的末尾时,分别记录A / B的最后一个元素。如果最后两个元素不一样,那么这两个列表就没有交集。
方法:两个指针法。
注意点:下一个地址可能为NULL;链表长度不同/相同。
自己的C++代码:
class Solution {public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { ListNode *A=headA; ListNode *B=headB; if (!A||!B) return NULL; //获取节点差值N int A_count=0; int B_count=0; while (A||B) { if (A&&B) { A=A->next; A_count++; B=B->next; B_count++; } if (A && !B) { A=A->next; A_count++; } if (!A && B) { B=B->next; B_count++; } } int N=abs(A_count-B_count); A=headA; B=headB; if (N==0) { while(A&&B) { if (A!=B) { A=A->next; B=B->next; } else return A; } return NULL; } if (N > 0) { if(A_count > B_count) { for(int i=1;i<=N;i++) A=A->next; }else { for(int i=1;i<=N;i++) B=B->next; } while(A&&B) { if (A!=B) { A=A->next; B=B->next; } else return A; } return NULL; } }};
优化代码:
public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { if(headA==null || headB==null) return null; ListNode p = headA; ListNode q = headB; int pcount = 0; int qcount = 0; while(p.next != null || q.next != null) { if(p == q) return p; if(p.next != null) p = p.next; else ++qcount; if(q.next != null) q = q.next; else ++pcount; } if(p != q) return null; p = headA; q = headB; while(pcount-- != 0) { p = p.next; } while(qcount-- != 0) { q = q.next; } while(p != q) { p = p.next; q = q.next; } return p; } }
解法二:
public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { if(headA==null || headB==null) return null; ListNode p = headA; ListNode q = headB; if(p == q) return p; while(p!=null && q!=null) { p = p.next; q = q.next; } if(p==null) p = headB; else q = headA; while(p!=null && q!=null) { p = p.next; q = q.next; } if(p==null) p = headB; else q = headA; while(p!=null && q!=null) { if(p==q) return p; p = p.next; q = q.next; } return null; } }
0 0
- Leetcode 160 寻找两链表的交叉节点
- leetcode之返回交叉的节点
- [leetcode]Intersection of Two Linked Lists寻找两链表的公共节点
- 寻找单链表的中间节点
- 寻找单链表的中间节点
- 寻找共同的父节点
- 寻找有环单链表的入口节点
- 寻找网游和电子商务的最佳交叉
- 要寻找一个单链表的中间节点
- 寻找二叉树某节点的路径
- 寻找两个节点的最近公共祖先
- 寻找节点和最大的子树
- 一个寻找cocostudio任意节点的函数
- 寻找链表的中间节点
- 二叉树寻找值最大的节点
- Java:如何寻找单链表的中间节点
- 寻找单链表的倒数第四个节点
- 寻找链表的中间节点
- word2vec 中的数学原理详解
- [七]RabbitMQ-客户端源码之AMQPImpl+Method
- 2016河南省第九届ACM程序设计竞赛,问题 E: 机器设备
- LeetCode算法题目:Populating Next Right Pointers in Each Node II
- Java 文件的拷贝
- Leetcode 160 寻找两链表的交叉节点
- 判断101-200之间有多少个素数,并输出所有素数
- 关于找不到trainAutoencoder(自编码)问题
- JavaScript 字符串replace()和replayAll()
- ListView 中 BaseAdapter的使用
- 一张图了解:前端性能优化
- 串口编程—(2)编程步骤及参数设置
- 01_Ext JS入门
- MATLAB字符串全函数