链表相关-相交链表
相交链表
1.LeetCode原题地址
2.解法思路一:暴力求解,这个是很简单的,内嵌遍历循环就可以了,最开始想到的就这这种办法,由于for循环自带空值判定,所以不需要判断也可以
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode GetIntersectionNode(ListNode headA, ListNode headB) {
for(;headA!=null;headA = headA.next)
{
ListNode temp = headB;
for(;temp!=null;temp = temp.next)
{
if(headA==temp)
return headA;
}
}
return default;
}
}
3.解法思路二:双指针遍历,由于headA和headB的节点数是不相等了,但是在第一次相交后,节点数是必定相同的,因为保持了相同的引用,这是一种非常巧妙的解法,但是理解起来有点难,特别是双指针必定相交原因,强烈安利这位题主的解题思路,非常清晰
时间复杂度 O(a + b)O(a+b) : 最差情况下(即 |a - b| = 1∣a−b∣=1 , c = 0c=0 ),此时需遍历 a + ba+b 个节点。
空间复杂度 O(1)O(1) : 节点指针 A , B 使用常数大小的额外空间。
160. 相交链表(双指针,清晰图解) - 相交链表 - 力扣(LeetCode)
- 经典判空
- 设置俩个临时变量储存AB俩个节点
- 进行循环变量,跳出条件是tempA==tempB
- tempA节点和tempB节点同时向后移动,链表跑完则从头继续跑,长短链表都如此,此时考虑俩种情况
- 有相交点:有交点则必定会相遇,就像俩个人在操场跑圈,俩个人从不同的起跑点出发,可能速度有慢有快,但只要一直跑,总会相遇,这种问题类似于快慢指针的问题。
- 无相交点:这就是这个解法有意思的地方,即使没有相交点,最后也是会相遇的,不过这个相交点变成了最后俩个人的结束点,也就是tempA == tempB == null,所以不会陷入死循环;
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode GetIntersectionNode(ListNode headA, ListNode headB) {
if(headA == default || headB == default)
return default;
ListNode tempA = headA;
ListNode tempB = headB;
while(tempA!=tempB)
{
tempA = tempA!=null ? tempA.next : headA;
tempB = tempB!=null ? tempB.next : headB;
}
return tempA;
}
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 雪夜の自我救赎!
评论
ValineDisqus