LeetCode Intersection of Two Linked Lists (找交叉点)

 

 

题意:给两个链表,他们可能后部分有重叠的地方(重叠是指,两链表都有元素处于同一块地址上),一旦重叠到就不可能分开啦。问在哪重叠的?当然是返回地址了。不重叠就返回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代码

 

你可能感兴趣的:(intersect)