[LeetCode]160. 相交链表(java实现)双指针
1. 题目
2. 读题(需要重点注意的东西)
思路1(双指针):
要求: 时间复杂度O(m + n)
、空间复杂度O(1)
-
计算出两条链表的长度
-
让长的链表先走 k 步,k为两条链表长度之差
-
然后再一起走,看能否相遇
思路2(双指针):
如果没相遇,则证明不会相遇
3. 解法
---------------------------------------------------解法1---------------------------------------------------
/**
* 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) {
ListNode p = headA,q = headB;
int n = 0,m = 0;
while(p != null){
p = p.next;
n++;
}
while(q != null){
q = q.next;
m++;
}
// 重置p、q
p = headA;
q = headB;
int k = Math.abs(n - m);
// 使q、p达到同一起点
if(n > m){
while(k != 0){
k--;
p = p.next;
}
}else{
while(k != 0){
k--;
q = q.next;
}
}
// 一起走
while(p != null && q != null){
if(p == q) return q;
p = p.next;
q = q.next;
}
return null;
}
}
可能存在的问题:
---------------------------------------------------解法2---------------------------------------------------
/**
* 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) {
ListNode p = headA,q = headB;
while(p != q){
p = p == null ? headB : p.next;
q = q == null ? headA : q.next;
}
return q;
}
}
可能存在的问题: