Leetcode 160. 相交链表

问题描述

编写一个程序,找到两个单链表相交的起始节点。

如下面的两个链表:

注意点:实例一中相交的节点是8而不是1。这里可以这样理解两个链表相交的节点是指节点本身相同,而不单单是节点的值同,还要地址相同。相交点是出题者自己定义的,实例一的intersectval是 8 说明出题者定义的两个链表中的 1 在内存中的地址是不一样的,说明这两个节点不是同一个节点 虽然数据域 的数据一样。

 代码

方法一、暴力法

 1 class Solution {
 2 public:
 3     ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
 4         ListNode *qA = headA;ListNode *qB_test = headB;
 5         while(qA != NULL ){
 6 
 7             while(qB_test != NULL ){
 8                 if(qA == qB_test) 
 9                     return qA;
10                 qB_test = qB_test->next;
11             }
12             qB_test = headB;
13             qA = qA->next; 
14         }
15         return NULL;
16     }
17 };

无论何时不能忘记暴力,就是循环搜索。时间复杂度O(mn),即两个链表长度乘积。空间复杂度O(1)

方法二、类似环中追击问题(双指针法)

 上图详见 https://leetcode-cn.com/problems/intersection-of-two-linked-lists/solution/jiao-ni-yong-lang-man-de-fang-shi-zhao-dao-liang-2/

 1 class Solution {
 2 public:
 3     ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
 4         if(headA == NULL || headB == NULL) return NULL;
 5         auto pA = headA ; auto pB = headB;
 6         while(pA != pB) {
 7             pA = pA == NULL ? headB : pA->next;
 8             pB = pB == NULL ? headA : pB->next;
 9         }
10         return pA ;
11     }
12 };

关于while循环,如果长度相同,且没有交点,在循环到第一轮末尾时,pA和pB会同时为null,这时就相等退出了。如果长度不同,没有交点,会在第二轮末尾同时为null,相等退出。

原文地址:https://www.cnblogs.com/fresh-coder/p/13246550.html