题目
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
题目数据 保证 整个链式结构中不存在环。
思路
使用两个指针x,y同时遍历两个链表A和B。
当两个链表有相交节点时,将链表分为两段,
A = a+c
B =b+c
a和c为两个链表不同的节点,c为两个链表共同的节点。
当x指针到达A链表末尾时,让x指针指向B链表头。
当y指针到达B链表末尾时,让y指针指向A链表头。
x指针的路程为a+c+b+c;
y指针的路程为b+c+a+c;
两指针会在最后的c段路程相遇。
当两链表没有相交节点时,两指针会分别走到两个链表的尾部。
代码
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode *preA=headA,*preB=headB;while(!(preA==NULL&&preB==NULL)){ if(preA==NULL){preA=headB;}if(preB==NULL){preB=headA;}if(preA==preB){return preB;}preA=preA->next;preB=preB->next;}return NULL;}
};