LeetCode(160):相交链表
题目介绍
编写一个程序,找到两个单链表相交的起始节点。
输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Reference of the node with value = 8
输入解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
题解一:直接暴力法
/**
*直接暴力法,只要headA中的节点在,headB中出现即可。时间复杂度:O(mn) 空间复杂度:O(1)
**/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null) {
return null;
}
ListNode a = headA;// headA 头节点既为第一个节点
ListNode b= headB;
//
while(a != null){
while(b != null){
if(a == b){
return a;
}
b = b.next;
}
a = a.next;
b = headB;
}
return null;
}
}
题解二:双指针法
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null) {
return null;
}
ListNode a = headA;// headA 头节点既为第一个节点
ListNode b= headB;
while(a != b){ // 循环结束条件值得学习,可以当两者同时为null时就推出循环。同时也符合两者相等满足条件时
a = a == null ? headB : a.next; // 当headA执行到最后时,将指针指向headB
b = b == null ? headA : b.next;// 当headB执行到最后时,将指针指向headA
// 只要存在的换,a == b !=null
}
return a;
}
}
本文介绍了如何找到两个单链表相交的起始节点,并提供了两种解决方案:直接暴力法和双指针法。直接暴力法通过遍历两个链表来查找相同的节点,而双指针法则利用了两个指针交替前进的特性来简化问题。
479

被折叠的 条评论
为什么被折叠?



