ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

链表6:链表相交(面试题02.07)

2022-08-11 18:01:42  阅读:114  来源: 互联网

标签:lenB lenA ListNode 02.07 面试题 链表 curB curA


本题如下:(链接:https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/)

题目:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。

图示两个链表在节点 c1 开始相交:

 

 

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。

 

 

 

 

 

 

 

思路:这道题其实并不复杂,简单来说,就是求两个链表交点节点的指针。 这里需要注意,交点不是数值相等,而是指针相等。

为了方便举例,假设节点元素数值相等,则节点指针相等。

看如下两个链表,目前curA指向链表A的头结点,curB指向链表B的头结点:

 

 

 

 我们求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置,如图:

 

 

此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。

否则循环退出返回空指针。

 

 

那么就可以得到相应的C++代码:

 1 class Solution {
 2 public:
 3     ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
 4         ListNode* curA = headA;
 5         ListNode* curB = headB;
 6         int lenA = 0, lenB = 0;
 7         while (curA != NULL) { // 求链表A的长度
 8             lenA++;
 9             curA = curA->next;
10         }
11         while (curB != NULL) { // 求链表B的长度
12             lenB++;
13             curB = curB->next;
14         }
15         curA = headA;
16         curB = headB;
17         // 让curA为最长链表的头,lenA为其长度
18         if (lenB > lenA) {
19             swap (lenA, lenB);
20             swap (curA, curB);
21         }
22         // 求长度差
23         int gap = lenA - lenB;
24         // 让curA和curB在同一起点上(末尾位置对齐)
25         while (gap--) {
26             curA = curA->next;
27         }
28         // 遍历curA 和 curB,遇到相同则直接返回
29         while (curA != NULL) {
30             if (curA == curB) {
31                 return curA;
32             }
33             curA = curA->next;
34             curB = curB->next;
35         }
36         return NULL;
37     }
38 };

其中,时间复杂度为:O(n + m),空间复杂度为:O(1)。

 

 

同样地,下面给出Java版本的代码:

 1 public class Solution {
 2     public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
 3         ListNode curA = headA;
 4         ListNode curB = headB;
 5         int lenA = 0, lenB = 0;
 6         while (curA != null) { // 求链表A的长度
 7             lenA++;
 8             curA = curA.next;
 9         }
10         while (curB != null) { // 求链表B的长度
11             lenB++;
12             curB = curB.next;
13         }
14         curA = headA;
15         curB = headB;
16         // 让curA为最长链表的头,lenA为其长度
17         if (lenB > lenA) {
18             //1. swap (lenA, lenB);
19             int tmpLen = lenA;
20             lenA = lenB;
21             lenB = tmpLen;
22             //2. swap (curA, curB);
23             ListNode tmpNode = curA;
24             curA = curB;
25             curB = tmpNode;
26         }
27         // 求长度差
28         int gap = lenA - lenB;
29         // 让curA和curB在同一起点上(末尾位置对齐)
30         while (gap-- > 0) {
31             curA = curA.next;
32         }
33         // 遍历curA 和 curB,遇到相同则直接返回
34         while (curA != null) {
35             if (curA == curB) {
36                 return curA;
37             }
38             curA = curA.next;
39             curB = curB.next;
40         }
41         return null;
42     }
43 
44 }

 

标签:lenB,lenA,ListNode,02.07,面试题,链表,curB,curA
来源: https://www.cnblogs.com/cnwsh/p/16576983.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有