使用空间存储节点的解法
class Solution {
public:
set<ListNode*> s;
ListNode *findFirstCommonNode(ListNode *headA, ListNode *headB) {
for (auto i = headA; i ; i=i->next)
s.insert(i);
for (auto i = headB; i ; i=i->next)
if(s.count(i)) return i;
return NULL;
}
};
不使用空间,解法一
如果有公共结点肯定是在后面重叠,且后面部分都是共同的。
- 先计算出两个链表的长度,可以让比较长的先走两个链表长度之差的步数,两个再一起走。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *findFirstCommonNode(ListNode *headA, ListNode *headB) {
int len1=0,len2=0;
auto i=headA,j=headB;
for (auto i = headA; i ; i=i->next) len1++;
for (auto i = headB; i ; i=i->next) len2++;
if(len1<len2)
{
swap(len1,len2);
swap(i,j);
}
int offset=len1-len2;
for (int t = 0; t < offset; t ++ ) i=i->next;
while(i)
{
if(i==j) return i;
i=i->next;
j=j->next;
}
return NULL;
}
};
标签:结点,ListNode,int,auto,next,链表,headB,headA,公共
From: https://www.cnblogs.com/tangxibomb/p/17362206.html