相交链表
题目
相交链表(力扣:160)
编写一个程序,找到两个单链表相交的起始节点。
分析
常规解法:计算出两个链表的长度,然后算出长度差cha;让长度较长的链表先走cha步,这样就补齐了两个链表之间长度的差异,最后向后遍历,节点相等的地方即为解。
简单解法:该题最关键的是如何补齐两个链表之间的长度差。我们两个链表同时遍历,遍历结束时,让两个链表分别指向对方链表的头部,继续遍历,这样长度补齐了,当节点相等时,即为解。
代码实现:常规解法
/**
* 160. 相交链表
* @param headA
* @param headB
* @return
*/
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null){
return null;
}
int l1 = 0, l2 = 0;
ListNode curA = headA, curB = headB;
while (curA != null){
l1++;
curA = curA.next;
}
while (curB != null){
l2++;
curB = curB.next;
}
int cha = Math.abs(l1 - l2);
if (l1 >= l2){
while (cha > 0){
headA = headA.next;
cha--;
}
}else {
while (cha > 0){
headB = headB.next;
cha--;
}
}
while (headA != null){
if (headA == headB){
return headA;
}
headA = headA.next;
headB = headB.next;
}
return null;
}
代码实现:简单解法
/**
* 160. 相交链表
* @param headA
* @param headB
* @return
*/
public ListNode getIntersectionNode2(ListNode headA, ListNode headB) {
if (headA == null || headB == null){
return null;
}
ListNode curA = headA, curB = headB;
while (curA != curB){
curA = curA == null ? headB : curA.next;
curB = curB == null ? headA : curB.next;
}
return curA;
}