题目描述
输入两个链表,找出它们的第一个公共节点。
方法一:
获得两个链表的长度,先让路程长的指针走几个节点,就可以保证两个指针最后同时到达链表尾,也就可以同时到达交节点。
int lenA = 0;
int lenB = 0;
ListNode startA = headA;
ListNode startB = headB;
while(startA!=null){
startA= startA.next;
lenA++;
}
while(startB != null){
startB = startB.next;
lenB++;
}
注意这里需要新建一个ListNode,指向headA,否则headA = headA.next会导致空指针。
通过lenA与lenB大小,判断哪个指针先走,先走的指针要走的步数即为abs(lenA-lenB)。
然后两个指针每移动一次,判断是否走到同一个结点,若是,该结点即为交结点
/**
* 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) {
int lenA = 0;
int lenB = 0;
ListNode startA = headA;
ListNode startB = headB;
while(startA!=null){
startA= startA.next;
lenA++;
}
while(startB != null){
startB = startB.next;
lenB++;
}
ListNode node1 = headA;
ListNode node2 = headB;
if(lenA >= lenB){
for(int i = 0;i<lenA - lenB;i++){
node1 = node1.next;
}
}else{
for(int j = 0;j<lenB - lenA;j++){
node2 = node2.next;
}
}
while(node1!=node2){
node1 = node1.next;
node2 = node2.next;
}
return node1;
}
}
方法二:
使用两个指针 node1,node2 分别指向两个链表 headA,headB 的头结点,然后同时分别逐结点遍历,当 node1 到达链表 headA 的末尾时,重新定位到链表 headB 的头结点;当 node2 到达链表 headB 的末尾时,重新定位到链表 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 node1 = headA;
ListNode node2 = headB;
while(node1 != node2){
node1 = node1 != null ? node1.next:headB;
node2 = node2 != null ? node2.next:headA;
}
return node1;
}
}