数组双指针

September 21, 2023

链表转换

这里没有记住,需要在吸收下 链表反转 206. 反转链表 for循环处理 时间复杂度O(N)(循环整个链表),空间复杂度O(1),只有几个临时变量 其实链表反转,无非就是上面这张图。 记录current的next节点(因为这里current的next需要指向pre) 把current的next指向pre 把current节点变成pre节点 把next节点变成current节点 最后当current节点变成空时,pre节点就是反转后的链表 代码如下: if head == nil || head.Next == nil { return head } current := head // 把头指向当前 var pre *ListNode // 做一个pre节点 for current != nil { next := current.Next // 1.记录当前的下一个节点 current.Next = pre // 2.把当前的next指向pre pre = current // 3.把current节点变成pre节点 current = next // 4.把next节点变成current节点 } return pre 迭代处理 核心思想:“2”节点后面的额所有元素都进过反转了,但是head“1”节点的next还是指向了“2”,所以可以直接把“2”的next指向head,这样就有反转后的链表了 if head == nil || head....

September 20, 2023

链表双指针

到现在面试经历过很多次了,却很少有成功,之前拒掉了几次面试,现在非常后悔。 这里记录下之前面试的他们的算法题 1. 如何判断一个链表有环 快慢指针可以解决这个问题 使用快慢指针。这里为什么会相遇?最坏的打算当慢指针走一圈的时候,快指针可以走两圈,所以刚好会在同一个点上面。 如果最后指向null,则说明没有环,如果最后走到了相同点,则说明有环。 如何判断该环的起点在什么地方 可以假设 环起点 到相遇点的距离为 m 那么head到 环起点 刚好是 k-m 因为慢指针走了 k 步快指针走了 2k 步相遇了,那么相遇点到快指针的相遇点(N圈之后的相遇点)距离就变成了 2k-k=k 距离一样。那么剪掉相同的环起点到相遇点的 m 都变成了 k-m 步。这样,把任何一个指针的头指针指向 head,用相同的速度,再次相遇点,就是环起点。 2. 两条链表是否相交 要判断两个链表是否相交,可以判断有没有共同部分,那么共同部分怎么判断呢? 最原始的办法:使用map(映射)来记录每个node的信息,java中地址值不存在,可以直接判断引用是否一致。golang可以根据地址是否一致,也可以记录value是否一致(当然存在相同的value的情况就不行了) 使用特殊手法,如下图 双指针同时进行 迭代A链表,结束后,迭代B链表 迭代B链表,结束后,迭代A链表 在迭代的时候,判断两个指针是否一致,如果存在一致 具体代码可以是 p1, p2 := headA, headB for p1 != p2 { if p1 == nil { p1 = headB } else { p1 = p1.Next } if p2 == nil { p2 = headA } else { p2 = p2....

September 19, 2023