文章目录
  1. 1. Intersection of Two Linked Lists
    1. 1.1. 题目
    2. 1.2. 思路
    3. 1.3. 解题

Intersection of Two Linked Lists

题目

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:          a1a2c1c2c3B:     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.

思路

分别计算两个链表的长度l1和l2,若l1>l2,p=headA,q=headB,p先行l1-l2步,然后p和q同时移动。同理,l1<l2,p=headA,q=headB,q先行l2-l1步,然后p和q同时移动。返回p和q相等的结点。

解题

c++版

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
42
43
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/

class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
int lenA=0,lenB=0,count;
ListNode *cur,*p,*q;
cur=headA;
while(cur){
lenA++;
cur=cur->next;
}
cur=headB;
while(cur){
lenB++;
cur=cur->next;
}
p=headA;
q=headB;
if(lenA>lenB){
count=lenA-lenB;
while(count--)
p=p->next;
}
else{
count=lenB-lenA;
while(count--)
q=q->next;
}
while(p!=q){
p=p->next;
q=q->next;
}
return p;

}
};

python版

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
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None

class Solution:
# @param two ListNodes
# @return the intersected ListNode
def getIntersectionNode(self, headA, headB):
pA = headA
pB = headB
lenA=0
lenB=0
while(pA):
lenA+=1
pA=pA.next
while(pB):
lenB+=1
pB=pB.next
if lenA<=lenB:
n=lenB-lenA
pA = headA
pB = headB
while(n):
pB=pB.next
n=n-1
else:
n=lenA-lenB
pA = headA
pB = headB
while(n):
pA=pA.next
n=n-1
while pA!=pB:
pA=pA.next
pB=pB.next
return pA
文章目录
  1. 1. Intersection of Two Linked Lists
    1. 1.1. 题目
    2. 1.2. 思路
    3. 1.3. 解题