Intersection of Two Linked Lists
2015-12-09 16:10
239 查看
Write a program to find the node at which the intersection of two singly linked lists begins.
For example, the following two linked lists:
begin to intersect at node c1.
Notes:
If the two linked lists have no intersection at all, return
The linked lists must retain their original structure after the function returns.
You may assume there are no cycles anywhere in the entire linked structure.
Your code should preferably run in O(n) time and use only O(1) memory.
解题思路:
1、可以将A,B两个链表看做两部分,交叉前与交叉后。
2、交叉后的长度是一样的,因此交叉前的长度差即为总长度差。
3、只要去除这些长度差,距离交叉点就等距了。
4、为了节省计算,在计算链表长度的时候,顺便比较一下两个链表的尾节点是否一样,若不一样,则不可能相交,直接可以返回NULL。
For example, the following two linked lists:
A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3
begin to intersect at node c1.
Notes:
If the two linked lists have no intersection at all, return
null.
The linked lists must retain their original structure after the function returns.
You may assume there are no cycles anywhere in the entire linked structure.
Your code should preferably run in O(n) time and use only O(1) memory.
解题思路:
1、可以将A,B两个链表看做两部分,交叉前与交叉后。
2、交叉后的长度是一样的,因此交叉前的长度差即为总长度差。
3、只要去除这些长度差,距离交叉点就等距了。
4、为了节省计算,在计算链表长度的时候,顺便比较一下两个链表的尾节点是否一样,若不一样,则不可能相交,直接可以返回NULL。
/** * 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) { if(headA == NULL || headB == NULL) return NULL; int lenA = 1; int lenB = 1; ListNode *tempA = headA; ListNode *tempB = headB; while(tempA->next != NULL){ tempA = tempA->next; lenA++; } while(tempB->next != NULL){ tempB = tempB->next; lenB++; } if(tempA != tempB) return NULL; if(lenA>lenB){ for(int i=0;i<lenA-lenB;i++){ headA = headA->next; } } if(lenB>lenA){ for(int i=0;i<lenB-lenA;i++){ headB = headB->next; } } while(headA != headB){ headA = headA->next; headB = headB->next; } return headA; } };
相关文章推荐
- SpringMVC使用@ResponseBody时返回json的日期格式、@DatetimeFormat使用注意
- 游标-批量修改数据
- 工具的使用——谷歌浏览器(chrome)
- 基于python的模拟鼠标进行百度知道自动签到程序
- iMac苹果电脑Android开发环境的搭建
- 文章标题
- 验证手机
- 验证电话
- 牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结
- 数据库模式中三大范式
- select的5中子句where,group by, havaing, order by, limit的使用顺序及实例
- 操作系统与网络实现 之十一
- linux 上挂载硬盘或者读取u盘数据
- 安全策略的生成----SEAndroid in Android 5.x
- 几个常用的js 函数汇总大全
- MFC中Edit控件显示系统时间
- xml数据导航
- SpringMVC中四个基本注解
- 浅谈OracleBulkCopy的使用
- Maximum Depth of Binary Tree