题目描述
输入两个链表,找出它们的第一个公共节点
示例:
思路:双指针;
引用一位大佬的解释
使用两个指针nodeA nodeB分别指向两个链表的头节点headA
headB,然后同时遍历分别遍历,当nodeA节点到达链表A的结尾时,重新指向headB链表的头结点;当nodeB结点到达链表B的结尾时,重新指向headA链表的额头结点。
解决方法
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode nodeA = headA, nodeB = headB;
while(nodeA != nodeB){ //注意这个位置,不是nodeA.val != nodeB.val,他们两个都是链表的结点,所以直接比较就行;如果遇到nodeA这个结点和一个值的比较时,可以这样写:int a=1; nodeA.val == a;
nodeA = nodeA != null ? nodeA.next : headB;
//nodaA到达链表A的结尾时,重新指向headB的头结点哦,不是nodeB!!
nodeB = nodeB != null ? nodeB.next : headA;
}
return nodeA;
}
}
链表长的先走,移动到的位置剩下的节点和另一个链表的节点数相等;
两个再一起移动,判断是否相等
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
if(pHead1 == null || pHead2 == null)
return null;
ListNode a = pHead1, b = pHead2;
int lengthA = length(pHead1), lengthB = length(pHead2);
if(lengthA > lengthB){
for(int i=0; i<lengthA-lengthB; i++)
a = a.next;
}else{
for(int i=0; i<lengthB-lengthA; i++)
b = b.next;
}
while(a != b){
a = a.next;
b = b.next;
}
return a;
}
public int length(ListNode node){
ListNode tmp = node;
int count = 0;
while(tmp != null){
tmp = tmp.next;
count++;
}
return count;
}
}