随笔分类 - 链表
摘要:三步走方案 第一步:原链表基础上每个节点后新建一个完全一致的辅助节点,例如1->2->3, 调整后为1->1^->2->2^->3->3^ 第二步:将辅助节点的random节点赋值为原节点random的next,比较绕口,这里举个例子 比如原节点1的random节点为3,此时1^的random也是3
阅读全文
摘要:比较简单的递推 1 class Solution { 2 public ListNode addTwoNumbers(ListNode l1, ListNode l2) { 3 ListNode l3 = new ListNode(),l4=l3; 4 int tag=0; 5 while(l1!=
阅读全文
摘要:利用快慢指针来处理 时间O(n),空间O(1) 1 public ListNode middleNode(ListNode head) { 2 if(head==null || head.next==null) return head; 3 ListNode slow=head,fast=head.
阅读全文
摘要:删除链表元素我们很熟了,但需要确保head如果去除的话该如何返回的问题。 public ListNode removeElements(ListNode head, int val) { ListNode res = new ListNode(0); res.next=head; ListNode
阅读全文
摘要:迭代链表中的每个节点,依次递推 public ListNode deleteDuplicates(ListNode head) { ListNode curr=head; while(curr!=null && curr.next!=null){ // 如前后2个节点相同,则丢弃next节点,将当前
阅读全文
摘要:对于这题,参数只有需要被删除的这个元素。 这里我们以 4,5,1,9为例,我们要删除1,我们可以将9覆盖1的val,同时将1的next指向9的next, 这样就相当于我们用后一节点的值覆盖当前节点,然后丢下后续节点,直接指向next.next节点。 public void deleteNode(Li
阅读全文
摘要:弗洛伊德算法,快慢指针可解 假设headA与headB相交,且分别长a+c,b+c(c为相交长度) 那么必然存在a+c+b+c=b+c+a+c(即当我们遍历完headA后再遍历headB与 先遍历headB再遍历headA,最终一定会在同一节点处相遇) 然后我们发现,即使不相交,依然存在a+b=b+
阅读全文
摘要:快慢指针,也叫佛洛依德算法 即使用一个快指针,每次前进2位,慢指针每次前进1位,如果存在环, 则快慢指针必然会在环的开始处相交(可以参考追及问题) 时间O(n),空间O(1) public boolean hasCycle(ListNode head) { // 首先确保后续节点存在 if (hea
阅读全文
摘要:比较简单得题目,一次迭代可以得出结果 时间O(n),空间O(1) public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode l3 = new ListNode(),l4=l3; while (l1!=null && l2!=
阅读全文
摘要:使用迭代得方法,用3个指针,分别指向后一个元素,当前元素和前一个元素, null->1->2,flow=null,curr=1,prev=2,迭代时将flow指向curr得next,再将flow指向curr, 最后将prev覆盖curr即可。时间O(n),空间O(1) public ListNode
阅读全文

浙公网安备 33010602011771号