题意:给两个链表,他们可能后部分有重叠的地方(重叠是指,两链表都有元素处于同一块地址上),一旦重叠到就不可能分开啦。问在哪重叠的?当然是返回地址了。不重叠就返回null。
思路:用O(n)和O(1)的做法。
(1)若两串会重叠,那么到最后一个元素必定会相遇。
(2)先判断是否有重叠。
(3)有重叠了,要考虑两串长度不一样。后段肯定一样,不重叠的那一段可能不一样。要让它们同长才行,使得两个指针每次只走1步才会相遇。
(4)交叉遍历一次就可以使得两个指针处于那样的位置啦。一个指向短链的开头,一个指向长链的前段部分中的某个位置。
不是很简洁的代码:
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { 12 ListNode *L1=headA; 13 ListNode *L2=headB; 14 //若无交点,且AB等长,那么他们会在null处相遇,退出。 15 //先判断是否有交点先。 16 while(L1&&L1->next) L1=L1->next; 17 while(L2&&L2->next) L2=L2->next; 18 if(L1!=L2) return NULL; 19 L1=headA; 20 L2=headB; 21 while(L1!=L2) 22 { 23 if(L1) L1=L1->next; 24 else L1=headB; 25 26 if(L2) L2=L2->next; 27 else L2=headA; 28 } 29 return L1; 30 } 31 };
AC代码
很傻逼但AC的代码:
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { 12 ListNode *p=headA; 13 while(p) p->val*=-1,p=p->next; 14 15 ListNode *q=headB; 16 while(q&&q->val>=0 ) q=q->next; 17 18 p=headA; 19 while(p) p->val*=-1,p=p->next; 20 21 22 if(q) return q; 23 else 0; 24 25 26 } 27 };
AC代码
简洁的代码:
时间: 2024-11-05 20:41:34