
linked list
USC_ECE
这个作者很懒,什么都没留下…
展开
-
JZ25 复杂链表的复制
复制每个节点,如:复制节点A得到A1,将A1插入到节点A后面; 遍历链表,A1.random = A.random.next; 将链表拆分成原链表和复制后的链表。/*public class RandomListNode { int label; RandomListNode next = null; RandomListNode random = null; RandomListNode(int label) { this.label = lab原创 2020-09-06 20:53:56 · 203 阅读 · 0 评论 -
JZ16 合并两个排序的列表
采用假头+双指针法,但是需要注意当遍历完了至少一个list以后的情况(即post-processing)。代码如下:/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode Merge(ListNode list1,ListN原创 2020-08-28 12:31:18 · 112 阅读 · 0 评论 -
JZ14 链表中倒数第k个结点
这道题需要用双指针去做:先让fast走k步,再让fast和slow一起走直到fast走过最后一个node。记得要考虑corner case。https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/solution/mian-shi-ti-22-lian-biao-zhong-dao-shu-di-kge-j-11//*public class ListNode { int val;原创 2020-07-26 09:05:46 · 109 阅读 · 0 评论 -
LeetCode 82. Remove Duplicates from Sorted List II
首先加一个假头,然后双指针prev和curr。主要考虑两种情况:1 -> 2, 1 -> 1 -> 2。https://leetcode.wang/leetCode-82-Remove-Duplicates-from-Sorted-ListII.html/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * L原创 2020-07-07 08:24:37 · 84 阅读 · 0 评论 -
LeetCode 369. Plus One Linked List
这种方法比较巧妙,思路是遍历链表,找到右起第一个不为9的数字,如果找不到这样的数字,说明所有数字均为9,那么在表头新建一个值为0的新节点,进行加1处理,然后把右边所有的数字都置为0即可。举例来说:比如1->2->3,那么第一个不为9的数字为3,对3进行加1,变成4,右边没有节点了,所以不做处理,返回1->2->4。再比如说8->9->9,找第一个不为9的数字为8,进行加1处理变成了9,然后把后面的数字都置0,得到结果9->0->0。再来看9->9->原创 2020-06-17 09:54:06 · 134 阅读 · 0 评论 -
LeetCode 445. Add Two Numbers II
这道题有两种解法:1.利用栈的先进后出原则实现加法,将链表数据入栈,栈顶为低位。这里采用头插法来使链表逆序/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val,.原创 2020-06-16 14:17:55 · 206 阅读 · 0 评论 -
LeetCode 2. Add Two Numbers
很经典的一道题,有几个需要注意的地方。使用c1和c2来遍历两个linked list; 创建了一个dummyHead来应对各种corner case; 定义一个sum变量,用来存放两个数对应位之和; while循环的退出条件是c1和c2都为null,并且可以用if语句来处理c1和c2二者有一个为null的情况; 上一个循环的sum到下一个循环除以10得到进位(0或者1); 新建node的时候不改变sum的值,而是使用sum % 10; 循环结束后还要检查是否存在进位的情况。代码如下:原创 2020-06-16 13:30:50 · 202 阅读 · 2 评论 -
LeetCode 160. Intersection of Two Linked Lists
这道题虽然被标成简单,但是我觉得还是发人深省的。首先我们可以用Set来做,祝这里就不再赘述。我们主要讨论的是双指针法,这个方法十分的巧妙。虽然题目中强调了链表中不存在环,但是我们可以用环的思想来做,我们让两条链表分别从各自的开头开始往后遍历,当其中一条遍历到末尾时,我们跳到另一个条链表的开头继续遍历。两个指针最终会相等,而且只有两种情况,一种情况是在交点处相遇,另一种情况是在各自的末尾的空节点处相等。为什么一定会相等呢,因为两个指针走过的路程相同,是两个链表的长度之和,所以一定会相等。举个栗子:假设list原创 2020-06-16 08:29:11 · 104 阅读 · 0 评论 -
LeetCode 92. Reverse Linked List II
我们可以看出来,总共需要n-m步即可,第一步是将结点3放到结点1的后面,第二步将结点4放到结点1的后面。这是很有规律的操作,那么我们就说一个就行了,比如刚开始,prev指向结点1,start指向结点2,然后我们建立一个临时的结点then,指向结点3(注意我们用临时变量保存某个结点就是为了首先断开该结点和前面结点之间的联系,这可以当作一个规律记下来),然后我们断开结点2和结点3,将结点2的next连到结点4上,也就是 start.next = then.next,再把结点3连到结点1的后面结点的前面,即 th原创 2020-06-12 12:49:52 · 77 阅读 · 0 评论 -
LeetCode 147. Insertion Sort List
一个元素一个元素的从原链表中取出来,然后按顺序插入到新链表中,时间复杂度为 O(n^2),是一种效率并不是很高的算法,但是空间复杂度为 O(1),以高时间复杂度换取了低空间复杂度。代码如下:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { thi原创 2020-06-12 09:37:23 · 208 阅读 · 2 评论 -
LeetCode 328. Odd Even Linked List
这道题真的让我收获蛮大的,代码如下,注释都写在里面:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = v原创 2020-06-12 06:42:21 · 106 阅读 · 0 评论 -
LeetCode 83. Remove Duplicates from Sorted List
这道题虽然是简单题,但是有些启发价值的。他的解法和第203题非常类似,唯一区别在于没有用dummyHead。排除linkedlist为空或者只有一个node的两种corner case; 再设置两个prev和curr两个指针分别指向head和head.next; 当curr不为空时:如果curr.val == prev.val, 则perv.next = curr.next; 否则 prev = curr; 两种情况都需要curr = curr.next;我自己的理解是prev的物理意义是无重复v原创 2020-06-12 06:01:25 · 130 阅读 · 0 评论 -
LeetCode 143. Reorder List
这道题是Find a Middle Node, Reverse the Second Part of the List以及Merge Two Sorted Lists的综合。注意到函数的返还值类型是void,代码如下:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(原创 2020-06-09 13:19:55 · 87 阅读 · 0 评论 -
LeetCode 142. Linked List Cycle II
这道题可以用两种解法来做,分别是Set和Two Pointers。这里推荐第二种做法,因为它的空间复杂度是O(1)。Set /** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */pu.原创 2020-06-09 07:56:46 · 121 阅读 · 0 评论 -
LeetCode 24. Swap Nodes in Pairs
本题一样也是有两种解法:Iterative solution /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this..原创 2020-05-25 14:46:54 · 83 阅读 · 0 评论 -
LeetCode 206. Reverse Linked List
这是一道很基本的题目,有Iterative和Recursive两种解法,我们最好都需要熟悉。Iterative solution /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNod原创 2020-05-25 13:42:58 · 160 阅读 · 0 评论