• 【LeetCode】相交链表(快慢指针)


    力扣 相交链表

    题目链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists

    题目大致意思就是判断两个链表有没有交点,有的话给出交点,没有的话返回null

    要求是不能修改链表,并且时间复杂度为O(N+M),空间复杂度为O(1)

    假设,有两个链表A和B,长度为N和M,p和q分别指向A和B链表的头节点

    方法1:

    • 长链表上的指针先走|N-M|步,然后两个链表上的指针一起走,如果有交点,某个时刻,两个指针指向的节点必会是同一个节点

    方法2:

    • 两个指针分别向后走,p走到nil则p指向B头结点然后继续走,q走到nil则q指向A的头结点然后继续走

    • 当A和B链表没有交点时,p和q走完N+M步后,必定p和q都指向nil

    • 当A和B链表存在交点时,某一时刻p和q必定指向同一个节点,该节点就是相交节点

    代码如下:

    方案1:

    func getIntersectionNode(headA, headB *ListNode) *ListNode {
    	m,n:=0,0
    	p,q:=headA,headB
    	for p!=nil{
    		m++
    		p=p.Next
    	}
    	for q!=nil{
    		n++
    		q=q.Next
    	}
    
    	p,q=headA,headB
    	if m<n{
    		step:=n-m
    		for step>0{
    			q=q.Next
    			step--
    		}
    	}else {
    		step:=m-n
    		for step>0{
    			p=p.Next
    			step--
    		}
    	}
    
    	
    	for p!=nil&&q!=nil{
    		if p.Val==q.Val&&p==q{
    			return p
    		}
    		p=p.Next
    		q=q.Next
    	}
    	return nil
    }
    

    方案2:

    
    func getIntersectionNode(headA, headB *ListNode) *ListNode {
    	p,q:=headA,headB
    	if p==nil||q==nil{
    		return nil
    	}
    
    	for p!=q{
    		if p==nil{
    			p=headB
    		}else {
    			p=p.Next
    		}
    		if q==nil{
    			q=headA
    		}else {
    			q=q.Next
    		}
    	}
    	return p
    }
    
  • 相关阅读:
    常见hash算法的原理
    【学习干货】给coder的10个读书建议
    htc one x刷机记录
    Linux 搭建SVN server
    javascript
    USACO comehome Dijkstra
    当设计师、产品经理和程序员去交友站点找女朋友
    Spring3.0 AOP 具体解释
    慕课网Hibernate初探之一对多映射实验及总结
    C++数组引用
  • 原文地址:https://www.cnblogs.com/yinbiao/p/15981203.html
Copyright © 2020-2023  润新知