Java实现求相交链表交点
题目介绍
返回值为8的节点
无交点,返回null
节点数据结构
public class ListNode {
public int val;
public ListNode next;
public ListNode() {}
public ListNode(int val) { this.val = val; }
public ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
实现方法
1、长的先走,同步后一起走
//相交链表
//时间复杂度:O(n)
//空间复杂度:O(1)
private static ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode p = headA;
ListNode q = headB;
int lenA=0, lenB=0;
while (p!=null) {
p = p.next;
lenA++; //A长度
}
while (q!=null) {
q = q.next;
lenB++; //B长度
}
int d = 0;
p = headA;
q = headB;
if (lenA > lenB) {
d = lenA -lenB; //两者之差
while (p!=null) { //A先走
if (d <= 0) //长的先走,走d步后停止
break;
p = p.next;
d--;
}
} else {
d = lenB -lenA;
while (q!=null) { //B先走
if (d <= 0)
break;
q = q.next;
d--;
}
}
while (p!=q) { //直到p和q指向相同的节点就停止
p = p.next;
q = q.next;
}
return p;
}
2、同时走,走到null时赋值为另一条链表头节点,两者最多走lenA+lenB,始终会相遇
图片来自
@王小二
private static ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null)
return null;
ListNode p = headA;
ListNode q = headB;
while (p != q) {
p = p == null ? headB : p.next;
q = q == null ? headA : q.next;
}
return p;
}
main方法
public static void main(String[] args) {
long startTime = System.currentTimeMillis(); //获取开始时间
ListNode l1 = new ListNode(5);
ListNode a = new ListNode(5);
ListNode l2 = new ListNode(4, l1);
ListNode l3 = new ListNode(8, l2);
ListNode l4 = new ListNode(1, l3);
ListNode l5 = new ListNode(4, l4);
ListNode m1 = new ListNode(1, l3);
ListNode m2 = new ListNode(0, m1);
ListNode m3 = new ListNode(5, m2);
System.out.println(getIntersectionNode(l5, m3).val);
long endTime = System.currentTimeMillis(); //获取结束时间
System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间
}