题目思路:求两个链表是否存在交集。
交集:在当前节点到最后节点的所有值都相同
首先只能想到比较笨的暴力方法:在A和B的所有节点,遍历到最后的节点,判断是否相同。
参考了一些博客之后:
博客
明白了隐含条件,如果两个链表长度不一样时,那么交集点肯定存在在长度差的地方。
于是也就有了
解决方法1:首先求出两个链表长度,并且将较长的链表进行后移,知道达到长度相同的点。然后开始判断两个链表节点是否相同,如果相同,那么肯定当前点为交点。
解决方法2:是上面方法的一种更加智慧的方式,在链表A和B长度不同的时候,不是进行长度计算和后移到相同点,而是直接进行后移。
例如:当A后移到null点时,接到B上。当B后移到null时,接到A上。这样也就变相解决了长度不同的问题,相当与将A和B拼接起来进行判断,那么当A当前节点==B当前节点时,也就是跑到对面节点上,找到交集。
方法1:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { //如果两个链表存在着交集,那么两个链表的长度差时,值肯定是一样的 ListNode *p1 = headA; ListNode *p2 = headB; int l1 = getlen(p1); int l2 = getlen(p2); int l = l1>l2?l1-l2:l2-l1; // cout<<l1<<" "<<l2<<" "<<l<<endl; if(l1>l2){ while(l>0){ p1 = p1->next; l--; } }else{ while(l>0){ p2 = p2->next; l--; } } while(p1&&p2){ if(p1==p2){ return p1; }else{ p1=p1->next; p2=p2->next; } } return NULL; } int getlen(ListNode *p){ int len = 0; while(p){ len++; p = p->next; } return len; }
方法2:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { ListNode *p1 = headA; ListNode *p2 = headB; while(p1!=p2){ p1 = p1?p1->next:headB; p2 = p2?p2->next:headA; } return p1; }