思路描述:首先如果两个链表相交,则它们第一个交点之后的节点必然相交,即从首个交点之后两链表就重合了,原因为每个节点只能指向一个节点,因此相交形状一定为Y型不可能为X。
对于此题如果仅判断是否相交,我们可以之间遍历到最后一个节点,判断是否相同,相同相交,否则为不相交。但此题要求返回相交的首个节点,因此可以首先求出两个链表的长度差,让长的链表
先开始前进到两链表长度相等,然后开始双方同步遍历,寻找是否存在相同节点,此时找到的第一个节点即为相交的第一个节点。
具体LeetCode代码如下:
/** * 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 *hA=headA; ListNode *hB=headB; int l1=0,l2=0; while(hA){ l1++; hA=hA->next; } while(hB){ l2++; hB=hB->next; } int sub; if(l1>l2){ sub=l1-l2; while(sub){ headA=headA->next; sub--; } } else{ sub=l2-l1; while(sub){ headB=headB->next; sub--; } } while(headA){ if(headA==headB){ return headA; } headA=headA->next; headB=headB->next; } return NULL; } };