「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战」。
21. 合并两个有序链表
描述
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = []
输出:[]
示例 3:
输入:l1 = [], l2 = [0]
输出:[0]
做题
思路:
两个链表都已经排好序了,我们只需要挨个比较选取最小的那个放在我们新建的一个链表上就行了。
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode result = new ListNode(-1);
ListNode head = result;
ListNode temp = null;
while(list1!=null && list2 !=null){
if(list1.val<list2.val){
temp=list1;
list1=list1.next;
}else{
temp=list2;
list2=list2.next;
}
temp.next = null;
head = head.next=temp;
}
if(list1 == null){
head.next = list2;
}else{
head.next = list1;
}
return result.next;
}
这个内存占用有点高,本来想试着看看能不能不新建一个链表来存放结果,我试了很久,使用这种循环的方式实在做不了啊,只能使用递归的方式才行得通,但递归本身就会占用很多内存,所以就没有必要了。
206. 反转链表
描述
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
做题
思路:
这道题稍微有点绕,加深我对链表的感觉。
同样还是先创建一个新的节点来接后面的链表。
遍历链表,在每次连接节点时,先将新建的节点 result 后的链表存起来,存到 temp2,再把遍历链表的当前节点 head 后的链表存起来,存在 temp1。
然后我们就可以连接节点了,因为要倒叙,所以新节点都是连接在 result 后面,直接放在 result.next 就可以了。
剩下的就是处理存起来的链表,temp2 接到新节点的后面,temp1 赋值给 head(以便继续遍历)
public ListNode reverseList(ListNode head) {
ListNode result = new ListNode(-1);
ListNode temp1 = null;
ListNode temp2 = null;
while(head!=null){
temp2 = result.next;
temp1 = head.next;
head.next = temp2;
result.next = head;
head = temp1;
}
return result.next;
}
最后
今天就到这里了。
这里是程序员徐小白,【每日算法】是我新开的一个专栏,在这里主要记录我学习算法的日常,也希望我能够坚持每日学习算法,不知道这样的文章风格您是否喜欢,不要吝啬您免费的赞,您的点赞、收藏以及评论都是我下班后坚持更文的动力。