
链表
机智的豆子
现在学习编程还在挣扎阶段,需要有恒心才能坚持下来。
展开
-
合并两个有序链表21
方法一:递归思路我们可以如下递归地定义两个链表里的 merge 操作(忽略边界情况,比如空链表等):也就是说,两个链表头部值较小的一个节点与剩下元素的 merge 操作结果合并。算法我们直接将以上递归过程建模,同时需要考虑边界情况。如果 l1 或者 l2 一开始就是空链表 ,那么没有任何操作需要合并,所以我们只需要返回非空链表。否则,我们要判断 l1 和 l2 哪一个链表的头节点的值更小,然后递归地决定下一个添加到结果里的节点。如果两个链表有一个为空,递归结束。class Solution {原创 2020-06-30 00:56:32 · 497 阅读 · 0 评论 -
环形链表141
方法 1:哈希表想法如果我们用一个 Set 保存已经访问过的节点,我们可以遍历整个列表并返回第一个出现重复的节点。class Solution { public boolean hasCycle(ListNode head) { if (head == null || head.next == null) { return false; } Set<ListNode> set = new HashSet<原创 2020-06-29 23:43:02 · 159 阅读 · 0 评论 -
两两交换链表节点24
方法一:迭代我们把链表分为两部分,即奇数节点为一部分,偶数节点为一部分,A 指的是交换节点中的前面的节点,B 指的是要交换节点中的后面的节点。在完成它们的交换,我们还得用 prevNode 记录 A 的前驱节点。算法:1.firstNode(即 A) 和 secondNode(即 B) 分别遍历偶数节点和奇数节点,即两步看作一步。2.交换两个节点: firstNode.next = secondNode.next secondNode.next = firstNode3.还需要更新 prev原创 2020-06-29 23:16:37 · 445 阅读 · 0 评论 -
反转链表(206)
1.双指针法1.1 解题思路1.我们可以申请两个指针,第一个指针叫 prev,最初是指向 null 的。2.第二个指针 curr 指向 head,然后不断遍历 curr。3.每次迭代到 curr,都将 curr 的 next 指向 prev,然后 prev 和 curr 前进一位。4.都迭代完了(curr 变成 null 了),prev 就是最后一个节点了。1.2 代码思路 /** * 双指针迭代 * 我们可以申请两个指针,第一个指针叫 pre,最初是指向 null 的。原创 2020-06-27 23:34:37 · 437 阅读 · 0 评论