您的位置:首页 > 其它

两个链表的交叉——值得注意的错误

2016-01-21 14:43 453 查看
class Solution {
public:
/**
* @param headA: the first list
* @param headB: the second list
* @return: a ListNode
*/
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
// write your code here
if(headA == NULL ||headB == NULL){return NULL;}
ListNode *a = reverse(headA);
ListNode *b = reverse(headB);
//reverse headA后  headA与headB相同的节点部分被改变
ListNode *p = b;
bool inter  = false;
while(a != NULL && b != NULL){
if(a == b){
p     = a;
a     = a->next;
b     = b->next;
inter = true;
}
else {
break;
}
}
if(inter){
return p;
}
else {
return NULL;
}
}
ListNode *reverse(ListNode *head) {
ListNode *prev = NULL;
while(head != NULL){
ListNode *temp = head->next;
head->next     = prev;
prev           = head;
head           = temp;
}
return prev;
}

};

注意!reverse headA后  headA与headB相同的节点部分被改变。

所以这个算法不可行!

正确算法:class Solution {
public:
/**
* @param headA: the first list
* @param headB: the second list
* @return: a ListNode
*/
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
// write your code here
if(headA == NULL || headB == NULL){return NULL;}
int sizeA = sizeoflist(headA);
int sizeB = sizeoflist(headB);
int n = sizeA - sizeB;
ListNode *fast = new ListNode(0);
ListNode *slow = new ListNode(0);
if(n>0){
fast = headA;
slow = headB;
}
else {
fast = headB;
slow = headA;
n = -n;
}
for(int i = 0;i<n;i++){
fast = fast->next;
}
while(fast != slow){
fast = fast->next;
slow = slow->next;
}
return fast;
}
int sizeoflist(ListNode *head){
int size = 0;
while(head != NULL){
head = head->next;
size++;
}
return size;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: