剑指offer029-排序的循环链表

排序的循环链表

Posted by 高明 on 2020-01-01

剑指offer029-排序的循环链表

题目

给定循环单调非递减列表中的一个点,写一个函数向这个列表中插入一个新元素 insertVal ,使这个列表仍然是循环升序的。

给定的可以是这个列表中任意一个顶点的指针,并不一定是这个列表中最小元素的指针。

如果有多个满足条件的插入位置,可以选择任意一个位置插入新的值,插入后整个列表仍然保持有序。

如果列表为空(给定的节点是 null),需要创建一个循环有序列表并返回这个节点。否则。请返回原先给定的节点。

 

示例 1:


 

输入:head = [3,4,1], insertVal = 2
输出:[3,4,1,2]
解释:在上图中,有一个包含三个元素的循环有序列表,你获得值为 3 的节点的指针,我们需要向表中插入元素 2 。新插入的节点应该在 1 和 3 之间,插入之后,整个列表如上图所示,最后返回节点 3 。


示例 2:

输入:head = [], insertVal = 1
输出:[1]
解释:列表为空(给定的节点是 null),创建一个循环有序列表并返回这个节点。

示例 3:

输入:head = [1], insertVal = 0
输出:[1,0]

 

提示:

  • 0 <= Number of Nodes <= 5 * 10^4
  • -10^6 <= Node.val <= 10^6
  • -10^6 <= insertVal <= 10^6

 

注意:本题与主站 708 题相同: https://leetcode-cn.com/problems/insert-into-a-sorted-circular-linked-list/

Related Topics
  • 链表

  • 👍 17
  • 👎 0
  • 思路

    用数组的想法,这个数字一定是插入到两个数字的中间

    如果是自然升序,则如果插入数值在中间范围,就放入

    如果是降序,则如果大于最大,或者小于最小,都可以插入

    代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    class Solution {
    public Node insert(Node head, int insertVal) {
    if (head == null) {
    head = new Node(insertVal);
    head.next = head;
    return head;
    }

    if (head.next == head) {
    Node t = new Node(insertVal);
    head.next = t;
    t.next = head;
    return head;
    }

    Node p1 = head;
    Node p2 = head.next;

    // 记录是否一直递增
    boolean record = true;

    while (p2 != head) {
    // 递增序列
    if (p2.val >= p1.val) {
    if (insertVal <= p2.val && insertVal >= p1.val) {
    Node t = new Node(insertVal);
    p1.next = t;
    t.next = p2;
    return head;
    }
    } else {
    if(record){
    if(insertVal >= p1.val || insertVal <= p2.val){
    Node t = new Node(insertVal);
    p1.next = t;
    t.next = p2;
    return head;
    }
    }
    record = false;
    }
    p1 = p1.next;
    p2 = p2.next;
    }

    // p2 == head
    if (p2.val >= p1.val) {
    if (insertVal <= p2.val && insertVal >= p1.val) {
    Node t = new Node(insertVal);
    p1.next = t;
    t.next = p2;
    return head;
    }
    }

    if(record){
    Node t = new Node(insertVal);
    p1.next = t;
    t.next = p2;
    return head;
    }
    return head;
    }
    }
    1
    2
    3
    解答成功:
    执行耗时:0 ms,击败了100.00% 的Java用户
    内存消耗:37.6 MB,击败了82.54% 的Java用户