滑动窗口法
一、题源:
面试题 02.07. 链表相交
问题描述
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
二、 思路:
1、暴力解法
最容易想到的方法就是对两个链表遍历,判断指针是否相等。
时间复杂度:
O
(
n
2
)
O(n^2 )
O(n2)
空间复杂度:
O
(
1
)
O(1)
O(1)
注:暴力法虽然思路简单,容易想到,但是事件复杂度太高,所以考虑有无简单的方法。
2、简单解法
由于这两个链表长度不同,所以无法统一处理,那么可以先得到链表长度,再截取多余的一段,最后同时遍历剩下的链表。
参考代码如下
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
struct ListNode * ptr;
int lengthA = 0, lengthB = 0;
ptr = headA;
//1、获取长度
while(ptr)
{
ptr = ptr->next;
++lengthA;
}
ptr = headB;
while(ptr)
{
ptr = ptr->next;
++lengthB;
}
//2、截取多余
if(lengthA > lengthB)
{
while(lengthA !=lengthB)
{
headA = headA->next;
--lengthA;
}
}
else
{
while(lengthA !=lengthB)
{
headB = headB->next;
--lengthB;
}
}
//3、同时遍历
while(headA)
{
if(headA == headB) return headA;
headA = headA->next;
headB = headB->next;
}
return 0;
}