Leetcode 160. 相交链表
Posted Uitachi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,相等退出。
以上是关于Leetcode 160. 相交链表的主要内容,如果未能解决你的问题,请参考以下文章