您的位置:首页 > 其它

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:
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: