相交链表的解答
这题要求判断两个链表是否相交,相交就返回相交的节点,不想交就返回NULL
思路如下:
1.先判断两个链表是否相交,定义两个指针分别指向两个链表,遍历链表,这个时候两个指针分别指向各自链表的尾结点,进行比较,如果不相同就是不想交,返回NULL,相同就是相交
2.两个链表是不一样长的,那我们可以通过第一步的循环得到两个链表的长度,这个时候再定义两个指针,一个指向长链表,一个指向短链表
3.计算长短链表的距离差,让指向长链表的节点先走,达到长短链表的指针在同一起跑线的效果
4.这个时候再进行比较,遍历整个链表,如果不相同,就继续往后移动,如果相同就停止循环
5.这个时候长短指针指向相同的节点,所以随便返回一个即可
代码如下:
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode* curA=headA,*curB=headB;//定义两个指针都指向头结点//先判断链表是否相交int lenA=1;//分别计算长度int lenB=1;//分别计算长度while(curA->next){curA=curA->next;lenA++;}//找到第一个链表的尾结点while(curB->next){curB=curB->next;lenB++;}//找到第二个链表的尾结点if(curA!=curB)//尾结点不相同,两个链表没有相交,返回NULL{return NULL;}//走到这里已经表示两个链表肯定会相交//通过lenA和lenB也已经知道两个链表分别含有的节点个数//长的先走,然后一起走int gap = abs(lenA-lenB);//定义两个指针,一个指向长链表,一个指向短链表struct ListNode* longlist=headA,*shortlist=headB;if(lenB>lenA){longlist=headB;shortlist=headA;}//不知道那个链表长,但是longlist一定指向长链表,shortlist一定指向短链表while(gap--)//通过循环,这个时候让长短指针指向同一起跑线{longlist=longlist->next;}while(longlist!=shortlist)//比较,如果不相同就往后{longlist=longlist->next;shortlist=shortlist->next;}//这时候已经相同,那随便返回一个即可return longlist;
}