链表-链表相交
文章目录
- 02.07. 链表相交
02.07. 链表相交
题目链接:
02.07. 链表相交
题目描述:
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构 。
思路:
简单来说,就是求两个链表交点节点的指针。 这里同学们要注意,交点不是数值相等,而是指针相等。
为了方便举例,假设节点元素数值相等,则节点指针相等。
看如下两个链表,目前curA指向链表A的头结点,curB指向链表B的头结点:
我们求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置,如图:
此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。
否则循环退出返回空指针。
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) {* val = x;* next = null;* }* }*/
public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode cur1 = headA;//指向headA的指针ListNode cur2 = headB;//指向headB的指针int len1 = 0;//链表A的长度int len2 = 0;//链表B的长度while(cur1!=null){cur1 = cur1.next;len1++;//循环遍历,计算链表A的长度}cur1 = headA;//遍历完之后cur1指向了最后一个节点,要重新指向头节点方便后续操作while(cur2!=null){cur2 = cur2.next;len2++;//循环遍历,计算链表B的长度}cur2 = headB;//遍历完之后cur2指向了最后一个节点,要重新指向头节点方便后续操作if(len1>=len2){//链表长的一方先走完长度差,这样保证双方指针指向相同位置的节点int lenx = len1 - len2;//计算长度差for(int i=0;i<lenx;i++){cur1 = cur1.next;}//两个指针同时移动,找相等的时候while(cur1!=null){if(cur1==cur2){return cur1;}else {cur1 = cur1.next;cur2 = cur2.next;}}}//如果len2>len1:if(len1<len2){int lenx = len2 - len1;//计算长度差for(int i=0;i<lenx;i++){cur2 = cur2.next;}//两个指针同时移动,找相等的时候while(cur1!=null){if(cur1==cur2){return cur1;}else {cur1 = cur1.next;cur2 = cur2.next;}}}return null;//没有相等的,就是没有地址一样的,没有相交,所以返回null。}
}
注:本文章参考代码随想录,下面是原文出处:链表相交