题目描述:
题号:160
给你两个单链表的头节点 headA
和 headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null
。
解题思路:
思路一:双指针遍历两遍
算法思路:
1、创建两个指针 A 和 B,初始时分别指向两个链表的头节点 headA 和 headB,然后将两个指针依次遍历两个链表的每个节点。每次操作需要同时更新指针 A 和 B。
2、如果指针 A 不为空,则将指针 A 移到下一个节点。同样如果指针 B 不为空,则将指针 B 移到下一个节点。
3、如果指针 A 为空,则将指针 A 移到链表 headB 的头节点;如果指针 B 为空,则将指针 B 移到链表 headA 的头节点。
若有相交,在两遍遍历的过程中,两指针会相遇。没有相交则它们会同时走到自己的末尾并等于NULL。(因为两遍遍历会使两指针都走过一样的路程)
时间复杂度:O(N)
空间复杂度:O(1)
C++
// C++
/**
* 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) {
if(headA == nullptr || headB == nullptr) {
return nullptr;
}
ListNode *A = headA, *B = headB;
while(A != B) {
A = A == nullptr ? headB : A->next;
B = B == nullptr ? headA : B->next;
}
return A;
}
};
go
// go
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func getIntersectionNode(headA, headB *ListNode) *ListNode {
if headA == nil || headB == nil {
return nil
}
A, B := headA, headB
for A != B {
if A != nil {
A = A.Next
} else {
A = headB
}
if B != nil {
B = B.Next
} else {
B = headA
}
}
return A
}