查找两个链表的交叉节点
2015-08-04 09:37
459 查看
1. 问题描述
给定两个单链表,查找这两个单链表的交叉节点。例如:链表listA为:a1→a2→c1→c2→c3a_1 \to a_2 \to c_1 \to c_2 \to c_3,链表listB为:b1→b2→b3→c1→c2→c3b_1 \to b_2 \to b_3 \to c_1 \to c_2 \to c_3。那么这两个的第一个交叉节点为c1c_1。2. 方法与思路
首先,观察一下交叉节点的特点。如果两个链表有交叉节点的话,那么这个交叉节点之后的其他节点都是相同的,也就是说两个链表的结构应该是YY字型的。也就是说,c1c_1之后的节点都是交叉节点。下面的问题就是如何确定c1c_1这个节点,我们可以设两个指针分别遍历两个链表,然后对比节点的值,但是两个链表可能是不等长的,我们可以先让长度较大的链表指针先走|len(listA)−len(listB)||len(listA)-len(listB)|步,然后在同步进行。
时间复杂度O(n)O(n),空间复杂度O(1)O(1)。
c++代码如下:
//求出链表长度 int getListLength(ListNode *head) { int len = 0; ListNode *tmp = head; while(tmp) tmp = tmp->next,len++; return len; } //判断交叉节点 ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { ListNode *a = headA, *b = headB; int ab = getListLength(a)-getListLength(b); if(ab > 0) { while(ab) a = a->next, ab--; } else if(ab < 0) { while(ab) b = b->next, ab++; } while(a && b) { if(a->val == b->val) return a; a = a->next; b = b->next; } return NULL; }
相关文章推荐
- web项目读取配置文件
- laraver ajax分页
- centOS安装qt4.8.0 - - ERROR: Package gstreamer-app-0.10 not found
- 【分块】UVA 12003 Array Transformer 水题
- 使用ffserver实现转发实时流媒体(摄像头捕获)
- 使用ffserver实现转发实时流媒体(摄像头捕获)
- Linux进程间通信之管道
- 使用ffserver实现转发实时流媒体(摄像头捕获)
- java执行顺序
- 使用ffserver实现转发实时流媒体(摄像头捕获) 分类: TI-AM335X arm-linux-Ubuntu ffmpeg-SDL-VLC-Live555 2015-08-04 09:36 5人阅读 评论(0) 收藏
- python利用datetime模块计算时间差
- ARC模式下,程序闪退原因
- HDU4514湫湫系列故事——设计风景线(并查集判环+最长直径)
- ffmpeg+ffserver搭建流媒体服务器
- ffmpeg+ffserver搭建流媒体服务器
- DevExpress v15.1:VCL控件功能增强(一)
- 【GDOI】模拟8.1总结
- SGU134 Centroid 树形DP,dfs建树
- VC 局域网内上传文件 FTP或盘符映射
- ffmpeg+ffserver搭建流媒体服务器