Leetcode.面试题02.07. 链表相交

 思路:
        做链表题,没事想想双指针!

        想要找到第一个相交节点,自然是思考顺着找还是倒着找啦!

  • 倒着找:

        倒着?递归!

        找?find?哈希表!

        哈哈!开玩笑。

        A链表用于存储,B链表一个一个对照就可以了。       

        如果使用哈希表,空间就不是o(1)了。题目告诉我们:

        进阶:你能否设计一个时间复杂度 O(n) 、仅用 O(1) 内存的解决方案?

  •  顺着找:

        真不好找!思考一下倒着为什么能找到?因为倒着找保证了A,B链表(齐头并退)齐头并进。

顺着为什么不能?因为距离第一个相交节点的距离不同。没有条件?那我们就要创造条件!

        如果知道了两个链表的长度,减去多余部分,就可以齐头并进了!

代码如下:


class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
		ListNode* a=headA;
		ListNode* b=headB;
		int lena=0,lenb=0;
		while(a){
			lena++;
			a=a->next;
		} 
		while(b){
			lenb++;
			b=b->next;
		}
		a=headA,b=headB;
		while(lena>lenb){
			lena--;
			a=a->next ; 
		}
		while(lenb>lena){
			lenb--;
			b=b->next ;
		}
		while(a){
			if(a==b){
				return a;
			}
			a=a->next;
			b=b->next;
		}
		return NULL;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值