Intersection of Two Linked Lists - LeetCode
2017-03-09 18:56
267 查看
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.
Difficulty: Easy
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.
要求:这个题要返回两个链表交集的第一个结点。时间复杂度为O(n) ,空间复杂度为O(1)
下面提供两种比较经典的思路:
方案一:1、 将两个链表遍历一次,得到每个链表的长度,和每个链表的最后一个结点,如果两个链表的最后一个结点不同,直接return null
2、根据两个链表的差值,将长的链表的指针先移动的差值位置,在同时向下遍历,知道找到第一个相同的结点,返回。
由于方案一较为常规,这里就不提供具体实现代码了。下面介绍一种特殊的解决方案。
方案二:
具体实现方式是从两个链表的头结点同时开始遍历,当一个链表的next为空时,从另一个链表的头开始遍历。也就是说两个链表遍历的总长度是相同的。
其中必然会出现交点。第一个相同的结点即为所求。
已上面两链表为例:遍历过程如下:
A: a1 -> a2 <
c285
span style="color:#333333;">->
c1 -> c2 -> c3 ->
b1 -> b2 -> b3 ->
c1 ->
c2 -> c3
B: b1 ->
b2 -> b3 -> c1 ->
c2 -> c3 -> a1 ->
a2 ->
c1 ->
c2 -> c3
故c1为第一个交集的第一个结点。
For example, the following two linked lists:
A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3
begin to intersect at node c1.
Difficulty: Easy
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.
要求:这个题要返回两个链表交集的第一个结点。时间复杂度为O(n) ,空间复杂度为O(1)
下面提供两种比较经典的思路:
方案一:1、 将两个链表遍历一次,得到每个链表的长度,和每个链表的最后一个结点,如果两个链表的最后一个结点不同,直接return null
2、根据两个链表的差值,将长的链表的指针先移动的差值位置,在同时向下遍历,知道找到第一个相同的结点,返回。
由于方案一较为常规,这里就不提供具体实现代码了。下面介绍一种特殊的解决方案。
方案二:
具体实现方式是从两个链表的头结点同时开始遍历,当一个链表的next为空时,从另一个链表的头开始遍历。也就是说两个链表遍历的总长度是相同的。
其中必然会出现交点。第一个相同的结点即为所求。
已上面两链表为例:遍历过程如下:
A: a1 -> a2 <
c285
span style="color:#333333;">->
c1 -> c2 -> c3 ->
b1 -> b2 -> b3 ->
c1 ->
c2 -> c3
B: b1 ->
b2 -> b3 -> c1 ->
c2 -> c3 -> a1 ->
a2 ->
c1 ->
c2 -> c3
故c1为第一个交集的第一个结点。
public ListNode getIntersectionNode(ListNode headA, ListNode headB) { //boundary check if(headA == null || headB == null) return null; ListNode a = headA; ListNode b = headB; //if a & b have different len, then we will stop the loop after second iteration while( a != b){ //for the end of first iteration, we just reset the pointer to the head of another linkedlist a = a == null? headB : a.next; b = b == null? headA : b.next; } return a; }
相关文章推荐
- [LeetCode]Intersection of Two Linked Lists
- 【leetcode 两个链表的交集点】Intersection of Two Linked Lists
- Leetcode_160_Intersection of Two Linked Lists
- Intersection of Two Linked Lists--leetcode
- 和大神们学习每天一题(leetcode)-Intersection of Two Linked Lists
- 【LeetCode】Intersection of Two Linked Lists
- LeetCode Intersection of Two Linked Lists
- leetcode: Intersection of Two Linked Lists
- LeetCode:Intersection of Two Linked Lists
- LeetCode Intersection of Two Linked Lists
- 【Leetcode】Intersection of Two Linked Lists in JAVA
- [Leetcode]Intersection of Two Linked Lists
- [Leetcode] Intersection of Two Linked Lists
- [leetcode]Intersection of Two Linked Lists —— 熟悉python
- leetcode:Intersection of Two Linked Lists
- [leetcode]Intersection of Two Linked Lists
- [LeetCode] Intersection of Two Linked Lists 两链表是否相交
- Leetcode: Intersection of Two Linked Lists
- Leetcode: Intersection of Two Linked Lists
- [leetCode] Intersection of Two Linked Lists