两个链表的交叉——值得注意的错误
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;
}
};
相关文章推荐
- 如何一次退出多个Activity
- 获取当前系统时间作为文件名
- 使用FMS 4.5(Flash Media Server 4.5) 搭建视频直播(HLS)
- Heritrix3.3.0源码阅读 允许重复下载
- mysql "email"字段 的属性项没有设置成UNSIGNED,但是添加'0'到email字段报错:#1062 –Duplicate entry '1' for key 'email',求解
- Java集合:树
- Ubuntu下Redis安装
- [原创]Centos7 内部常用软件升级计划
- 并查集-----集合以及计算----
- UIPickerView内容居中显示,设置初始默认值
- jquery mobile开发常见问题分析
- AndroidStudio中使用.9图片
- 统计二进制中1的个数(四种方案)
- HDU 1087 lcs变形 (简单DP)
- unity3d 消息传递系统Messaging System
- IOS多线程开发其实很简单
- 学习C++(2)之类的静态成员及静态成员函数
- 关于EF查询表里的部分字段
- 条款弹框提示实现
- XamarinForms教程构建XamarinForms开发环境