原题链接:面试题02.07.链表相交
思路:
求相交的起始结点,并不是值相交,而是结点相交,那么也就代表判断条件是指针指向的位置相等即可
A、B链表长度可能不一致,假设他们一定有相交的结点
那么需要做的 就是直接统一A和B链表的长度,然后一起从头遍历,指针指向的位置是否相同,相同则代表相交,返回相交的指针就可以
如果没有返回相交的指针,那就代表这两个链表没有相交的结点,返回NULL即可
全代码:
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {//遍历headA链表和headB链表的长度ListNode* heada = headA;ListNode* headb = headB;//统计headA和headB的长度int lenA = 0;int lenB = 0;while(heada != NULL){//统计headA长度heada = heada ->next;lenA++;}while(headb != NULL){//统计headB长度headb = headb ->next;lenB++;}if(lenA < lenB){//交换, 让链表A成为最长的链表swap(lenA,lenB);swap(headA,headB);}//求交点,是指针指向的位置相同 而不是值相同int len = lenA - lenB;//将指针重新指向新headA和headBheada = headA;headb = headB;while(len--){//让lenA指针移动到和lenB一样开头的地方heada = heada ->next;}while(heada != NULL){//开始判断相交点,如果不相交则一直更新位置if(heada == headb){//相交返回相交的指针return heada;}heada = heada ->next;headb = headb ->next;}return NULL;}
};