链表相交.
swap():用于交换同类型的变量
class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode*curA=headA;ListNode*curB=headB;int skipA=0,skipB=0;while(curA!=NULL){skipA++;curA=curA->next;}while(curB!=NULL){skipB++;curB=curB->next;}curA=headA;curB=headB;if(skipB>skipA){swap(skipA,skipB);swap(curA,curB);}int gap=skipA-skipB;while(gap--){curA=curA->next;}if(curA==curB){return curA;} while(curA!=NULL){curA=curA->next;curB=curB->next;if(curA==curB){return curA;} }return NULL;}
};
创建一个ListNode类型的指针curA,curA指向链表A的头节点headA。创建一个ListNode类型的指针curB,curB指向链表B的头节点headB。定义两个空间lenA,lenB用来记录链表A链表B的长度,并赋值为0。如果curA不为空NULL,则进入循环,A链表的长的lenA自加,curA后移,即curA=curA->next。跳出第一个循环。如果第二个链表B不为空NULL,则进入循环。B链表的长的lenB自加,curB后移,即curB=curB->next。跳出第二个循环。将curA指向第一个链表的头指针headA,将curB指向第二个链表的头指针headB,目的是重新定义头节点便于后续遍历。如果链表A的长度大于链表B的长度,则使用交换函数swap交换链表A的链表B长度以及链表。创建一个int类型的变量gap用于计算链表A和链表B的差。使用while循环让gap自减用实现让链表A和链表B的尾部对齐。如果头节点相同,则直接返回curA。如果链表A不为空。则进入循环。curA和curB后移,即curAt=curA->next,curB=curB->next。如果curA和curB相等,则返回curA。跳出第四个循环。这些条件都不满足的话就返回NULL。
主要思路:创建两个指针分别指向两个头结点,开辟两个空间用于记录两个链表的长度。遍历两个链表。用刚刚的指针分别指向两个链表的头结点。假设A链表是长链表,定义一个int类型的函数用于存储两个空链表的差。让长链表的头节点向后移是的两个链表的尾部对齐。如果两个链表的头结点相同则直接返回头节点。如果两个链表有相同值则返回长链表的头指针。都不满足的话返回空