面试中常见链表问题10:交叉链表的第一个公共节点
2016-06-06 15:58
501 查看
给定两个链表,如果这两个链表相交,则返回第一个相交的顶点,如果不相交,则返回空。比如 A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3 则返回c1节点。 方法一:(1)求出链表l1和l2的长度。(2)较长的链表先走|l1-l2|步。(3)设置两个指针,直到两个指针相等时,返回结果。
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { if (headA == NULL || headB == NULL) return NULL; int len1 = 1; int len2 = 1; ListNode *p1 = headA; ListNode *p2 = headB; while (p1->next) { len1++; p1 = p1->next; } while (p2->next) { len2++; p2 = p2->next; } if (p1 != p2) return NULL; p1 = headA; p2 = headB; if (len1 > len2) { int num = len1 - len2; while (num-- > 0) { p1 = p1->next; } } else { int num = len2 - len1; while (num-- > 0) { p2 = p2->next; } } while (p1 != p2) { p1 = p1->next; p2 = p2->next; } return p1; }方法二:(1)设置两个指针,判断两个指针是否为空,且是否相等。(2)两个指针每次都走一步,当l1指针为空时,则把l1设置为链表2的头指针,l2指针为空时,则把l2指针设置为链表1的头指针。
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { if(headA == NULL || headB == NULL) return NULL; ListNode *p1 = headA; ListNode *p2 = headB; while(p1 != NULL && p2 != NULL && p1 != p2) { p1 = p1->next; p2 = p2->next; if(p1 == p2) return p1; if(p1 == NULL) p1 = headB; if(p2 == NULL) p2 = headA; } return p1; }
相关文章推荐
- 黑马程序员:iOS开发行业为何“大不如前”
- 面试中常见链表问题9:对单链表进行插入排序
- 面试中常见链表问题8:重排链表
- 【LeetCode】Best Time to Buy and Sell Stock 程序员炒股 part.3
- 面试中常见链表问题7:反转链表2
- Java陷阱一箩筐----面试题集
- 程序员需要了解的东西-备
- hive面试问题
- 史上最强女游戏程序员
- 大数据常见面试题汇总(一)
- 面试必问Top10(2016.06.06)
- java面试之常见编程题
- java面试之常见编程题
- java面试之常见编程题
- 北航面试之操作系统面试每章的重点Get(完整版)
- 面试中常见链表问题6:划分链表
- 剑指Offer----面试题25:二叉树中和为某一值的路径
- 面试中常见链表问题5:删除链表中重复元素2
- 9个Java对象的初始化和回收的面试题
- 职场潜规则:公司出现这三种信号,你必须果断辞职!