编写一个程序,找到两个单链表相交的起始节点。
思路1
其中一个链表的每个节点地址存入set,
再遍历另一个链表,是否重复
思路2
先求两个链表的长度,然后根据长度差让两个链表从相同长度的位置开始比较,若相同则相交。
第一种解法:
/**
* 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*> addr;
while(headA){
addr.insert(headA);
headA=headA->next;
}
while(headB){
if(addr.find(headB)!=addr.end())
return headB;
headB=headB->next;
}
return NULL;
}
};
第二种解法:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
int getlength(ListNode* s){
int length=0;
while(s){
s=s->next;
length++;
}
return length;
}
ListNode* move(ListNode* s,int len){
while(s && len--){
s=s->next;
}
return s;
}
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(headA==NULL||headB==NULL)
return NULL;
int lengthA=getlength(headA);
int lengthB=getlength(headB);
if(lengthA>lengthB)
headA=move(headA,lengthA-lengthB);
else
headB=move(headB,lengthB-lengthA);
while(headA&&headB){
if(headA==headB)
return headA;
headA=headA->next;
headB=headB->next;
}
return NULL;
}
};