相交链表
点击链接做题
思路:
- 如何判断链表是否相交
- 找相交链表的起始节点
- 遍历两个链表,若尾结点相同,则链表一定相交。
- 两个链表节点个数相同:往后遍历,找到相交的位置
- 两个链表节点个数不同:
- 找两个链表的节点数差值
- 让长链表先走差值步
- 两个链表开始遍历,比较是否为同一个节点
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
ListNode* l1 = headA;
ListNode* l2 = headB;
int sizeA = 0, sizeB = 0;
//计算链表长度,保存在sizeA,sizeB里面
while(l1){
sizeA++;
l1 = l1->next;
}
while(l2){
sizeB++;
l2 = l2->next;
}
//计算链表差值(绝对值)
int gap = abs(sizeA - sizeB);
//让长链表先走gap步
ListNode* longList = headA;
ListNode* shortList = headB;
if(sizeA < sizeB){//说明sizeB链表更长一些,否则就不交换
longList = headB;
shortList = headA;
}
while(gap--){
longList = longList->next;
}
//此时longlist指针和shortlist指针在同一起跑线
//链表相交,链表不相交
while(longList && shortList){
if(longList == shortList){
//链表相交
return longList;
}
//继续往后走
longList = longList->next;
shortList = shortList->next;
}
//链表不相交
return NULL;
}