这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战
今天在leetcode上刷了几道题,来记录一下,大家也可以去试试呀。
反转链表
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
第一道就是我们的反转链表,我们可以来分析一下怎么实现它,实现步骤如下:
- 定义两个指针h、p,h指针指向链表的头指针,p指针指向遍历过元素链表
h.next = p;将当前元素的下一个元素指向前面的链表p = h;将p指向遍历后的链表首部head = head.next;依次遍历直到结束
初始值:1->2->3->4->5->NULL
第一次循环:
p -> null; h -> null head -> 1->2->3->4->5->NULL
====>
h -> 1; head -> 2->3->4->5->NULL; h -> 1 -> null; p -> 1 -> null
第二次循环:
p -> 1 -> null; h -> 1; head -> 2->3->4->5->NULL;
====>
h -> 2; head -> 3->4->5->NULL; h -> 2 -> 1 -> null; p -> 2 -> 1 -> null
依次执行,直到head为空
h -> 5; head -> null; h -> 5 -> 4 ... -> 1 -> null; p -> 5 -> 4 ... -> 1 -> null
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function(head) {
let p = null;
let h = null;
while(head !== null) {
h = head;
head = head.next;
h.next = p;
p = h;
}
return p;
};
至此,我们反转链表的算法也就实现了,是不是很简单忍不住试一把。
合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例如下:
输入: l1 = [1,2,4], l2 = [1,3,4]
输出: [1,1,2,3,4,4]
-----
输入: l1 = [], l2 = []
输出: []
分析如下:
- 当两个链表其中一个为空时,直接返回另一个链表,那么他就是有序的
- 当两个链表都不为空时进行比较,因为他们本身就是有序的,那么当第一个链表的第一个数小于第二个链表第一个数时,新链表的第一个数就是第一个链表的第一个数,他的下一个数就是
mergeTwoLists(l1.next, l2)中产生的最小数了,依次类推,进行递归得到结果。
var mergeTwoLists = function(l1, l2) {
if(!l1) return l2;
if(!l2) return l1;
while(l1 != null && l2 != null) {
if (l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}
};
至此,我们的合并两个有序链表到此也实现了,今天我们的刷题就到这里了,介绍了两道算法题。