题目描述:编写一个程序,找到两个单链表相交的起始节点。
链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists
示例:
求解思路:
- 创建两个引用,分别指向两个链表的头节点cur1、cur2;
- 比较两链表长度,若 l1 > l2,让 cur1 先走 l1 - l2 步;若 l2 > l1,让 cur2 先走 l2 - l1 步。使得两者处在同一起点位置处。
- 时cur1和cur2同时以同速度往后走,判断是否相遇,相遇点即为两链表交点。
代码实现:
public class Solution {
//求解链表长度
public int getLength(ListNode head){
int length = 0;
ListNode cur = head;
while(cur != null){
length++;
cur = cur.next;
}
return length;
}
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
//处理特殊情况
if(headA == null || headB == null){
return null;
}
int l1 = getLength(headA);
int l2 = getLength(headB);
ListNode cur1 = headA;
ListNode cur2 = headB;
//比较两链表长度,使两者处在同一起点位置上
if(l1 > l2){
for(int i = 0;i < l1 - l2;i++){
cur1 = cur1.next;
}
}else{
for(int i = 0;i < l2 - l1;i++){
cur2 = cur2.next;
}
}
//两引用同时往后走,相等即为交点
while(cur1 != null && cur2 != null){
if(cur1 == cur2){
return cur1;
}
cur1 = cur1.next;
cur2 = cur2.next;
}
return null;
}
}