剑指–两个链表的第一个公共节点
1,题目:




2,思路:
方法一:两次遍历:
- 1.考虑有公共节点的两个链表的特点:其结构看起来像一个倒下的Y,从第一个公共节点开始,之后它们所有的节点都是重合的,不可能再出现分叉。只是Y两端不重合的部分可能长度不同,我们可以采取以下方法来获得公共节点:
- 2.首先遍历两个链表得到它们的长度,就能知道哪个链表比较长,以及长的链表比短的链表多几个节点。
- 3.在第二次遍历的时候,在较长的链表上先走若干步,接着同时在两个链表上遍历,找到的第一个相同的节点就是它们的第一个公共节点。
还有一种方法,自己没有看懂,,,等看懂了再补上。
3,代码:
方法一:两次遍历:
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
/*
1.考虑有公共节点的两个链表的特点:其结构看起来像一个倒下的Y,从第一个公共节点开始,之后它们所有的节点都是重合的,不可能再出现分叉。只是Y两端不重合的部分可能长度不同,我们可以采取以下方法来获得公共节点:
2.首先遍历两个链表得到它们的长度,就能知道哪个链表比较长,以及长的链表比短的链表多几个节点。
3.在第二次遍历的时候,在较长的链表上先走若干步,接着同时在两个链表上遍历,找到的第一个相同的节点就是它们的第一个公共节点。
*/
int lengthA = 0, lengthB = 0;
ListNode tmpA = headA, tmpB = headB;
while(tmpA!=null){
tmpA=tmpA.next;
lengthA++;
}
while(tmpB!=null){
tmpB = tmpB.next;
lengthB++;
}
ListNode tmpLong = headA;//默认取A为长链表
ListNode tmpShort = headB;
int lengthDif = lengthA-lengthB;
if(lengthA<lengthB) {//若A不为长链表,则进行修改
tmpLong = headB;
tmpShort = headA;
lengthDif = lengthB-lengthA;
}
for(int i =0;i<lengthDif;i++) tmpLong=tmpLong.next;//长的链表先走差别的几步
while(tmpLong!=tmpShort){//此时两链表剩下的长度相同,这里的判断条件也可改为tmpShort!=null
tmpLong=tmpLong.next;
tmpShort=tmpShort.next;
}
return tmpLong;//若不存在公共节点,则此时tmpLong=null
}
}
391

被折叠的 条评论
为什么被折叠?



