题目:
Write a program to find the node at which the intersection of two singly linked lists begins.
For example, the following two linked lists:
A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3
begin to intersect at node c1.
Notes:
- If the two linked lists have no intersection at all, return
null
. - The linked lists must retain their original structure after the function returns.
- You may assume there are no cycles anywhere in the entire linked structure.
- Your code should preferably run in O(n) time and use only O(1) memory.
思路一:
利用HashMap进行比较,时间复杂度为O(n),空间复杂度为O(lengthA)或O(lengthB),不符合题目要求
代码:
/**
* 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 a = headA;
ListNode b = headB;
if(headA == null || headB == null) return null;
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
while(a != null){
map.put(a.val,0);
a = a.next;
}
while(b != null);{
if(map.containsKey(b.val)) return b;
b = b.next;
}
return null;
}
}
思路二:
若两个链表长度不同,则让较长的链表先走lengthA - lengthB步,然后两链表同时走,当出现相同时则证明相交。
代码:
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode a = headA;
ListNode b = headB;
int lengthA = 0;
int lengthB = 0;
if(headA == null || headB == null) return null;
//求出a,b的长度
while(a != null){
a = a.next;
lengthA ++;
}
while(b != null){
b = b.next;
lengthB ++;
}
a = headA;
b = headB;
if(lengthA >= lengthB){
int n = lengthA - lengthB;
while(n > 0){
a = a.next;
n --;
}
}else{
int n = lengthB - lengthA;
while(n > 0){
b = b.next;
n --;
}
}
while(a != b){
a = a.next;
b = b.next;
}
return a;
}
}