锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

02.07.链表相交

时间:2022-09-23 18:30:00 国产atca电源连接器

记录新手小白做题的过程。

题目:

给你两个单链表的头节点headA 和 headB ,请找出并返回两个单链表相交的起始节点。如果两个链表没有交点,请返回 null 。

在节点有两个链表 c1 开始相交:

保证 环不存在于整个链结构中。

请注意,函数返回结果后,链表必须 保持其原始结构 。


尝试:

想法:暴力解决方案,两个循环,一个记录A链数字,一个移动B链数字,如果两个结点相同,判断后面的数字是否相同,直到遇到结点。

class Solution { public:     ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {         ListNode *p1=headA;         ListNode *p2=headB;         int i=0,j=0;         for(;p1;i  ){             int count=p1->val;//记录p1结点的值             for(;p2;j  ){                 if(count==p2->val){//找到了相同数值的结点,判断后面的链表是否相等                         ListNode *cur=p2->next;                         ListNode *cur1=p1->next;                     while(cur){                         if(cur->val!=cur1->val){                             break;                         }                         cur=cur->next;                         cur1=cur1->next;                     }                     if(cur==nullptr&&cur1==nullptr)                         return p2->val;//如果,它们一直交到最后一个结点,找到了                 }                 p2=p2->next;             }             p1=p1->next;             p2=headB;//初始化p2         }         return null;     } };

编译错误显示在代码写出后。

1.cannot initialize return object of type 'ListNode *' with an lvalue of type 'int' return p2->val

不能初始化的类型是 'ListNode *' 左值类型为返回对象 'int' 返回 p2->val

大概意思是我需要返回结点,但我的返回已经成为Int整型

2.use of undeclared identifier 'null' return null;使用未声明的标识符"null"返回空

这个返回null看题解里写的。正确的应该是返回nullptr

改正后提交,对了44个,错了一个。

我不太明白我在哪个方向上犯了错误。如果这是错误的,其他的不应该是正确的。我怎么能跳过1 呢

看看别人的代码。


大神在评论区的做法:

点击链接

class Solution { public:     ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {         ListNode *A = headA, *B = headB;         while (A != B) {             A = A != B) {             A = A != nullptr ? A->next : headB;//遍历A,A是否等于空。为空继续遍历B,不为空则继续遍历             B = B != nullptr ? B->next : headA;//遍历B,类似上一行         }         return A;     } };

看到这个代码,瑟瑟发抖 。

指针先遍历A,再遍历B,另指针先遍历B,再遍历A,如果两者最终相等,说明两者有交点。如果两者都没有,那就是空的,但这也符合最终返回A的条件,因为A最终遍历为空。

great,真的很棒。

第二位大佬:

点击链接

class Solution { public:     ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {         ListNode* curA = headA;         ListNode* curB = headB;         int lenA = 0, lenB = 0;         while (curA != NULL) { // 求链表A的长度             lenA  ;             curA = curA->next;         }         while (curB != NULL) { // 求链表B的长度             lenB  ;             curB = curB->next;         }         curA = headA;         curB = headB;         // 让curA是最长链表的头,lenA为其长度         if (lenB > lenA) {             swap (lenA, lenB);             swap (curA, curB);         }         // 求长度差         int gap = lenA - lenB;         // 让curA和curB在同一起点(末尾对齐)         while (gap--) {             curA = curA->next;         }         // 遍历curA 和 curB,遇到同样的,直接返回         while (curA != NULL) {             if (curA == curB) {                 return curA;             }             curA = curA->next;             curB = curB->next;         }         return NULL;     } };

他的写作方法非常巧妙。当两个链表长度相同时,如果后面遇到相同的数字,它们将合并为相同的链表。

但我不这么认为。遇到同样的后面不一定合成链表。

这个问题似乎需要重新研究。

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章