[LeetCode]160. Intersection of Two Linked Lists 解题报告(C++)
题目描述
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.
题目大意
- 给两个单链表. 让你返回他们合并的位置.
- 若有返回那个位置.若没有返回NULL
解题思路
方法1:
- 若二者有合并的话.后面的个数都是一样的.
- 链表不同长度.长链表应该先走二者的差值步数.
- 然后在同步向前走.进行判断.
代码实现:
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
int len1 = 0; int len2 = 0;
ListNode* p1, *p2;
p1 = headA;
p2 = headB;
while (p1) {
len1++;
p1 = p1->next;
}
while (p2)
{
len2++;
p2 = p2->next;
}
int diff = abs(len1-len2);
if (len1 < len2) {
p1 = headB;
p2 = headA;
}
else {
p1 = headA;
p2 = headB;
}
while (diff > 0) {
p1 = p1->next;
diff--;
}
while (p1&&p2) {
if (p1 == p2) {
return p1;
}
else {
p1 = p1->next;
p2 = p2->next;
}
}
return NULL;
}
};
方法2:
- 巧妙解法!!! 采用环的思想!!!
- 让两个单链表分别从各自的开头向后遍历.
- 但其中一条到达末尾.则调到另一条链表的开始继续遍历.
- 两个遍历最终会相等. 1. 都走到末尾. 2. 走到了相交处.
- 为何一定会相等呢? 因为二者走过的路程相等.
代码实现:
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if (!headA || !headB) return NULL;
ListNode *a = headA, *b = headB;
while (a != b) {
a = a ? a->next : headB;
b = b ? b->next : headA;
}
return a;
}
};
小结
- 方法2简直鬼才啊!