leetcode-链表-删除排序链表中的重复元素和分隔链表

107 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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