什么是网站收录,杭州网站建设设计公司哪家好,上海高凡猎头公司,中国建设银行官网站纪念币力扣160.相交链表
题目描述
给你两个单链表的头节点 headA 和 headB #xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点#xff0c;返回 null 。
图示两个链表在节点 c1 开始相交#xff1a; 题目数据 保证 整个链式结构中不存在环。
注意…力扣160.相交链表
题目描述
给你两个单链表的头节点 headA 和 headB 请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点返回 null 。
图示两个链表在节点 c1 开始相交 题目数据 保证 整个链式结构中不存在环。
注意函数返回结果后链表必须 保持其原始结构 。
思路分析
首先明确题目所要求的
1.两链表是否相交
2.如果相交的话交点在哪
首先解决第一个问题判断是否相交。首先两个链表的头结点可能一样也可能不一样但如果相交的话它们的尾结点一定是同一个那么我们可以分别遍历这两个链表到尾如果一样的话就代表它们一定相交否则直接返回false。
到第二个问题找交点如果俩链表同时从头遍历再找它们相同的结点的话那么当俩链表长度不同指针就会错位这是不靠谱的做法正确的做法是将它们遍历的起点进行统一后再进行遍历直到碰到相同的结点就是它们的交点。
如何统一起点呢
首先找出较长链表将俩链表长度的差当作步数让长链表的指针先走完这些步数这样两个链表的指针就统一了之后两个指针再一起遍历直到碰到相同结点停止返回任意一个指针即是对应的交点。
完整代码
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode* curAheadA,*curBheadB;int lenA1,lenB1;//从1开始。while(curA){lenA;curAcurA-next;}while(curB){lenB;curBcurB-next;}if(curA!curB)/判断是否相交{return NULL;}int nabs(lenA-lenB);struct ListNode* longlistheadA,*shortlistheadB;//可以先假设其中一个为长链表。if(lenBlenA)//如果不是在交换即可。{longlistheadB;shortlistheadA;}while(n--)//长指针先走{longlistlonglist-next;}while(shortlist!longlist)//两个一起走直到相同停下{shortlistshortlist-next;longlistlonglist-next;}return longlist;//返回其中任意一个即可。
}
实现细节
注意比较的是该节点而非该节点的值因为链表是乱序且无规律的。