Write a program to find the node at which the intersection of two singly linked lists begins.

For example, the following two linked lists:

1
2
3
4
5
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.

思路

首先要明白题意,如果两个链表相交,这两个链表也不会再分离开。

从而可以先求出链表的长度。如果两个链表相交,对齐它们的尾部,总会在其中一个节点,两链表的值相同。

根据此思路,从而求出链表值相同的那个节点,即可以满足题意。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 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
"""
curA = headA
curB = headB
lenA = 0
lenB = 0
while (curA):
curA = curA.next
lenA += 1
while (curB):
curB = curB.next
lenB += 1
if (curA != curB):
return None
else:
curA = headA
curB = headB
if (lenA >= lenB):
for i in range(lenA-lenB):
curA = curA.next
else:
for i in range(lenB-lenA):
curB = curB.next
while (curA and curB):
if (curA == curB):
return curA
else:
curA = curA.next
curB = curB.next
return None