求两个相交链表的交点
1.第一个思路就是先用set存一个链表,在遍历第二条链表时,对每一个结点判断其是否在第一条链表中
/**
* 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) {
set<ListNode *> s;
ListNode * ptr=headA;
while(ptr){s.insert(ptr);ptr=ptr->next;}
ptr=headB;
while(ptr)
{
if(s.find(ptr)!=s.end())
return ptr;
ptr=ptr->next;
}
return NULL;
}
};
二、但这种做法显然达不到O(n)的时间,O(1)内存的要求
于是可以采用以下方法:先求两条链表的长度,求得长度差delta,对较长的链表跳过delta的长度,从此开始一起遍历,遇到相同的结点,即为交点
/**
* 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) {
int len1=0,len2=0,i,delta;
ListNode *ptr=headA,*a=headA,*b=headB;
while(ptr){len1++;ptr=ptr->next;}
if(!len1) return NULL;
ptr=headB;
while(ptr){len2++;ptr=ptr->next;}
if(!len2) return NULL;
delta=abs(len1-len2);
if(len1>len2)
for(i=0;i<delta;i++)
a=a->next;
else
for(i=0;i<delta;i++)
b=b->next;
while(a && b)
{
if(a==b)
return a;
a=a->next;
b=b->next;
}
return NULL;
}
};
本文探讨了寻找两个相交链表的交点问题,首先介绍了一种使用集合存储链表节点的方法,随后提出了一种更优的算法,通过计算链表长度差并同步遍历来实现O(n)时间和O(1)空间复杂度。
815

被折叠的 条评论
为什么被折叠?



