其他分享
首页 > 其他分享> > 链表6:链表相交(面试题02.07)

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

作者:互联网

本题如下:(链接: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