160 Intersection of Two Linked Lists
寻找两个单链表连接起来的地方
Python
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def __init__(self):
self.hash = []
def getIntersectionNode(self, headA, headB):
"""
:type head1, head1: ListNode
:rtype: ListNode
"""
p = headA
while p is not None:
self.hash.append(p)
p = p.next
p = headB
while p is not None:
if p in self.hash:
return p
p = p.next
return p
Java
分别遍历两个链表,得到分别对应的长度。然后求长度的差值,把较长的那个链表向后移动这个差值的个数,然后一一比较即可。代码如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public int getLength(ListNode head){
ListNode p = head;
int cnt = 0;
while(p != null){
cnt += 1;
p = p.next;
}
return cnt;
}
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null) return null;
int lenA = this.getLength(headA), lenB = this.getLength(headB);
if (lenA > lenB) {
for (int i = 0; i < lenA - lenB; ++i) headA = headA.next;
}
else {
for (int i = 0; i < lenB - lenA; ++i) headB = headB.next;
}
while(headA != null && headB != null && headA != headB){
headA = headA.next;
headB = headB.next;
}
return (headA != null && headB != null)? headA : null;
}
}
还有一种方法也非常巧妙,就是利用循环两个链表,使得两个指针相遇。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode p = headA, q = headB;
while(p != q){
p = (p != null) ? p.next : headB;
q = (q != null) ? q.next : headA;
}
return p;
}
}