原题: https://leetcode-cn.com/problems/intersection-of-two-linked-lists/
一、题目要求
编写一个程序,找到两个单链表相交的起始节点。
如下面的两个链表:
在节点 c1 开始相交。
注意:
- 如果两个链表没有交点,返回 null.
- 在返回结果后,两个链表仍须保持原有的结构。
- 可假定整个链表结构中没有循环。
- 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
二、解题
其中,ListNode定义如下:
package com.leetcode.test.linklist;
public class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
实现如下:
package com.leetcode.test.linklist;
import java.util.HashSet;
/**
* 相交链表
*/
public class Solution3 {
public static void main(String[] args) {
ListNode a1 = new ListNode(4);
ListNode a2 = new ListNode(1);
a1.next = a2;
ListNode b1 = new ListNode(5);
ListNode b2 = new ListNode(0);
ListNode b3 = new ListNode(1);
b1.next = b2;
b2.next = b3;
ListNode c1 = new ListNode(8);
ListNode c2 = new ListNode(4);
ListNode c3 = new ListNode(5);
c1.next = c2;
c2.next = c3;
a2.next = c1;
b3.next = c1;
ListNode l3 = getIntersectionNode(a1,b1);
System.out.print(l3.val );
}
//将第一个链表存入hashset中,然后遍历第二个链表,获取第一个相同的节点。如果不存在,返回null
public static ListNode getIntersectionNode(ListNode headA, ListNode headB) {
HashSet<ListNode> hashSet = new HashSet<>();
//遍历第一个链表
while (headA != null){
hashSet.add(headA);
headA = headA.next;
}
//遍历第二个链表
while (headB != null) {
if (hashSet.contains(headB)){
return headB;
} else {
headB = headB.next;
}
}
return null;
}
}
三、运行结果
四、提交结果