leetcode – 面试题 02.07. 链表相交
解题思路过程
注意:这道题要求解的是两链表相交的起始节点,一开始要搞清楚,求的是相交的指针节点,而不是相同的节点值。
没想法的时候直接上来暴力破解,嵌套循环去比较两链表的下一节点是否相同,但复杂度是O(n^2)。
其实仔细思考后,发现两链表相交后的链表长度是由较短的链表决定的,因为相交的起始节点后面的节点都相同,这就说明长链表总是会多走几步。
有了上面的基本想法,本题的解题思路就很清晰了:
- 先计算出两链表的长度,让长链表移动到短链表的同一起点处,即移动到与短链表长度相同。如下图
- 之后同一起点处开始遍历链表A、链表B,当遇到相同节点就返回该节点,无则返回NULL。
代码如下:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode * curA = headA;
ListNode * curB = headB;
int lenA = 0;
int lenB = 0;
//计算两链表的长度
while (curA != NULL) {
lenA++;
curA = curA->next;
}
while (curB != NULL) {
lenB++;
curB = curB->next;
}
//重置curA、curB到初始位置
curA = headA;
curB = headB;
//假设curA为最长链表的头节点,lenA为其长度
if (lenA < lenB) { //如果链表B比较长,交换两链表,包括交换长度lenA、lenB
swap(curA,curB);
swap(lenA,lenB);
}
int gap = lenA - lenB;
while(gap) { //移动curA节点,直至与curB为同一起点
curA = curA->next;
gap--;
}
//遍历curA、curB,比较链表两节点是否相同,遇到相同直接返回,否则返回NULL
while(curA) {
//注意,不是比较两节点的值,而是节点本身
if (curA == curB) {
return curA;
}
curA = curA->next;
curB = curB->next;
}
return NULL;
}