标签:
Write a program to find the node at which the intersection of two singly linked lists begins.
For example, the following two linked lists:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
begin to intersect at node c1.
题意:就是求取两个链表的交汇点,
要求:无交汇点返回NULL,否则返回交汇点的地址。
暴力思路:O(nm),固定A链表的第一个点,依次遍历B链表看是否有相同的点;接着固定A链表的第二个点,再依次遍历B链表,直到找到相同点为止。
hash解:时间复杂度O(n+m),空间O(n)或者O(m)
两指针解法:我们发现只要两个链表长度一样,就只需同时后移节点指针比较一个,若其中一个较长呢,其实处理一下,把两个链表变成一样长即可。
解法步骤:
1.求出两个链表的长度
2.若一样长,无需处理;若其中一个较长,则只需让较长的链表先走abs(lengthA-lengthB)步即可。
3.同时后移节点指针,直到找到交汇点。
代码:
class Solution { private: int getLength(ListNode* head){ if(head==NULL) return 0; ListNode* p=head; int res=0; while (p->next!=NULL) { ++res;p=p->next; } return res; } public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { if(headA==NULL||headB==NULL) return NULL; int length_A=getLength(headA); int length_B=getLength(headB); ListNode* pA=headA; ListNode* pB=headB; int dis=0; if (length_A>length_B) { dis=length_A-length_B; while (dis>0) { --dis; pA=pA->next; } }else if(length_A<length_B) { dis=length_B-length_A; while (dis>0) { --dis; pB=pB->next; } } while (pA!=NULL&&pB!=NULL&&pA!=pB) { pA=pA->next; pB=pB->next; } if(pA==pB&&pA!=NULL) return pA; else return NULL; } };
Intersection of Two Linked Lists(链表)
标签:
原文地址:http://www.cnblogs.com/fightformylife/p/4309810.html