Problem:
Write a program to find the node at which the intersection of two singly linked lists begins.
For example, the following two linked lists:
Explanation:
找两个链表的交点(地址相同的点)
My Thinking:
My Solution:
Optimum Thinking:
- 如果两个链表长度相等,那么同时遍历两个表直到两个指针地址相同即可,按此思想,计算两个链表的长度,将较长的链表从较短链表的开始处遍历即可。
- 同样用(1)的思想,当一个指针遍历完一个链表后,让他从另一个链表起点开始遍历,这样一个指针就可以领先两个链表的长度之差,也达到了将较长的链表从较短链表的开始处遍历的目的。
Optimum Solution:
(1)
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
int lenA = length(headA), lenB = length(headB);
while (lenA > lenB) {
headA = headA.next;
lenA--;
}
while (lenA < lenB) {
headB = headB.next;
lenB--;
}
while (headA != headB) {
headA = headA.next;
headB = headB.next;
}
return headA;
}
private int length(ListNode node) {
int length = 0;
while (node != null) {
node = node.next;
length++;
}
return length;
}
}
(2)
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null)
return null;
ListNode a = headA;
ListNode b = headB;
//遍历直到a和b相等(地址相等)
while( a != b){
//a或b到底后就变成另一个链表的头
a = a == null? headB : a.next;
b = b == null? headA : b.next;
}
return a;
}
}