题目
给定两个链表,判断两个链表是否相交,如果相交返回相交的交点,否则返回空结点。
思路
暴破法
采用双循环,从第一个链表第一个开始依次寻找第二个链表中的结点是否相同,这样下来时间复杂度为O(n*n),空间复杂度为O(1)哈希法
将第一个结点存入哈希表中,然后遍历第二个链表的结点判断是否有相同的结点双指针法
以上图为例,给定两个指针first和second,分别指向两个链表的头结点,每个指针先将自己的链表遍历一遍,然后遍历另一个链表,如果在这个过程中两个链表相等,则代表有交点,相等的那个结点即为交点。
解析:
first指针先遍历第一个链表,走了AD+DC的长度,然后first指针遍历第二个结点,当first指针指向D结点时,first指针走的长度时AD+DC+BD
seconde指针首先遍历第二个链表,走了BD+DC的长度,然后second指针遍历第二个结点,当second指针指向D结点时,second指针走的长度是BD+DC+AD
这两个指针走到D结点时走的长度是一样的,所以如果两个指针相同,必然是有交点。
时间复杂度O(n)
空间复杂度O(1)
c++代码
循环可以直接返回的原因是,当两个链表没有交点时,那两个指针一定都走到了链表末尾,都指向了空结点,可以直接返回。
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *first = headA, *second = headB, *temp;
while(first != second){
if(first == NULL) first = headB;
else first = first->next;
if(second == NULL) second = headA;
else second = second->next;
}
return first;
}