持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情
今天讲解的是链表系列的2道题:
1.删除排序链表中的重复元素
2.分隔链表
83. 删除排序链表中的重复元素
leetcode地址:leetcode.cn/problems/re…
难度
简单
描述
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
示例 1:
输入: head = [1,1,2]
输出: [1,2]
示例 2:
输入:head = [1,1,2,3,3] 输出:[1,2,3]
提示:
链表中节点数目在范围 [0, 300] 内 -100 <= Node.val <= 100 题目数据保证链表已经按升序 排列
解法
1.指定 cur 指针指向头部 head
2.当 cur 和 cur.next 的存在为循环结束条件,当二者有一个不存在时说明链表没有去重复的必要了
3.当 cur.val 和 cur.next.val 相等时说明需要去重,则将 cur 的下一个指针指向下一个的下一个,这样就能达到去重复的效果
4.如果不相等则 cur 移动到下一个位置继续循环
5.最后返回head
代码
/*
* @lc app=leetcode.cn id=83 lang=javascript
*
* [83] 删除排序链表中的重复元素
*/
// @lc code=start
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var deleteDuplicates = function(head) {
let cur = head;
while(cur && cur.next){
if(cur.val === cur.next.val){
cur.next = cur.next.next
}else{
cur = cur.next;
}
}
return head;
};
// @lc code=end
86. 分隔链表
leetcode地址:leetcode.cn/problems/pa…
难度
中等
描述
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
示例 1:
输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]
示例 2:
输入:head = [2,1], x = 2
输出:[1,2]
提示:
- 链表中节点的数目在范围
[0, 200]内 -100 <= Node.val <= 100-200 <= x <= 200
解法
1.使用small,large两个链表分别存储小于x和大于x的链表,并定义两个虚拟节点防止头节点为空
2.遍历原链表,如果当前元素小于x,则将small的next指针指向当前节点并前移small,否则将large的next指针指向当前节点并前移large,
3.收尾工作,large指向null,small的next指针指向largeDummy的next节点(即large的真正头节点),返回smallDummy的next指针
代码
/*
* @lc app=leetcode.cn id=86 lang=javascript
*
* [86] 分隔链表
*/
// @lc code=start
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @param {number} x
* @return {ListNode}
*/
var partition = function(head, x) {
let small = new ListNode(0);
let large = new ListNode(0);
let dummySmallHead = small;
let dummyLargeHead = large;
let cur = head;
while(cur){
if(cur.val < x){
small.next = cur;
small = small.next;
}else{
large.next = cur;
large = large.next;
}
cur = cur.next;
}
large.next = null;
small.next = dummyLargeHead.next;
return dummySmallHead.next;
};
// @lc code=end