1.返回相交链表第一个相交结点
Leetcode 160;medium;
此题的解:第一个阶段:首先获得A和B链表的长度lenA和lenB,定义headA和headB指针分别指向A和B链表的头部;
第二个阶段:如果lenA > lenB,先让headA走lenA - lenB步,然后headA和headB再一起向后移动,遇到相同结点返回就可以啦!
Key:别忘记获得长度后判断一下两条链表的最后一个节点是否相交,这样会减少没必要的迭代!
package linkedlist;
public class Main0160相交链表 {
public static void main(String[] args) {
ListNode headA = new ListNode(1);
ListNode node1 = new ListNode(2);
ListNode headB = new ListNode(1);
headA.next = node1;
headB.next = node1;
ListNode node = new Solution160().getIntersectionNode(headA, headB);
System.out.println(node.val);
}
}
// 判断两条单链表的最后一个节点是否相交,再求相交节点
class Solution160 {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null)
return null;
int lenA = 1, lenB = 1;
ListNode p, q;
for (p = headA; p.next != null; p = p.next)
lenA++;
for (q = headB; q.next != null; q = q.next)
lenB++;
if (p != q) // 判断最后一个结点是否相连,减少不必要的计算
return null;
p = headA;
q = headB;
if (lenA > lenB) {
for (int i = 0; i < lenA - lenB; i++)
p = p.next;
} else {
for (int i = 0; i < lenB - lenA; i++)
q = q.next;
}
while (p != q) {
p = p.next;
q = q.next;
}
return p;
}
}