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.
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.
LeetCode:链接
和剑指Offer_编程题36:两个链表的第一个公共结点是一道题。
第一种方法:我们可以把两个链表拼接起来,一个pHead1在前pHead2在后,一个pHead2在前pHead1在后。这样,生成了两个相同长度的链表,那么我们只要同时遍历这两个表,就一定能找到公共结点。
就是都让遍历的时候长度统一。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def getIntersectionNode(self, headA, headB):
"""
:type head1, head1: ListNode
:rtype: ListNode
"""
pheadA, pheadB = headA, headB
while pheadA != pheadB:
# 用pheadA是为了跳出不存在交点的循环
pheadA = pheadA.next if pheadA else headB
pheadB = pheadB.next if pheadB else headA
return pheadA
第二种方法:先依次遍历两个链表,记录两个链表的长度m和n,如果m>n,那么我们就先让长度为m的链表走m-n个结点,然后两个链表同时遍历,当遍历到相同的结点的时候停止即可。对于 m < n,同理。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def getIntersectionNode(self, headA, headB):
"""
:type head1, head1: ListNode
:rtype: ListNode
"""
if not headA:
return None
if not headB:
return None
lengthA = self.getcount(headA)
lengthB = self.getcount(headB)
if lengthA > lengthB:
longlength = headA
shortlength = headB
else:
longlength = headB
shortlength = headA
for i in range(abs(lengthA-lengthB)):
longlength = longlength.next
while longlength and shortlength:
if longlength == shortlength:
return longlength
longlength = longlength.next
shortlength = shortlength.next
return None
def getcount(self, head):
count = 0
while head:
count += 1
head = head.next
return count