剑指offer 专项突破版 29、排序的循环链表

题目链接

思路

本题有三个关键点

  • 如何遍历循环链表? 设置一个哨兵,当遍历的结点再次遇到哨兵时说明已经全部遍历一次了
  • 如何寻找插入位置? 插入只有两种情况,要么作为中间值插入,比如3插入2、4、5中,要么作为边界结点插入,如果1或6插入2、4、5中,对于边界值插入的情况,只需要找到值最大的结点,插入到他后方即可
  • 在寻找最大值结点的过程中,注意是>=,这样确保在有多个最大值的情况下,也能找到最后一个结点
class Solution {
    public Node insert(Node head, int insertVal) {

        Node insertNode = new Node(insertVal);

        if (null == head) {
            head = insertNode;
            head.next = head;

        } else {
            Node pre = head, next = head.next, biggestNode = head;

            //判断需要插的值会不会破坏改变边界
            while (next != head) {

                if (next.val >= biggestNode.val)
                    biggestNode = next;

                //是中间值 在此插入
                if (pre.val <= insertVal && next.val >= insertVal) {
                    pre.next = insertNode;
                    insertNode.next = next;

                    return head;
                } else {
                    pre = next;
                    next = next.next;
                }
            }

            if (pre.val <= insertVal && next.val >= insertVal) {
                pre.next = insertNode;
                insertNode.next = next;
            }
            else {
                insertNode.next = biggestNode.next;
                biggestNode.next = insertNode;
            }
        }
        return head;
    }
}
Go代码
func insert(aNode *Node, x int) *Node {
	if aNode == nil {
		node := &Node{
			Val:  x,
			Next: nil,
		}
		node.Next = node
		return node
	}
	if aNode.Next == nil {
		aNode.Next = &Node{
			Val:  x,
			Next: aNode,
		}
		return aNode
	}
	if aNode.Val <= x && aNode.Next.Val >= x {
		aNode.Next = &Node{
			Val:  x,
			Next: aNode.Next,
		}
		return aNode
	}

	node, maxNode := aNode.Next, aNode

	for ; node != aNode; node = node.Next {
		if node.Val <= x && node.Next.Val >= x {
			node.Next = &Node{
				Val:  x,
				Next: node.Next,
			}
			return aNode
		}
		if node.Val >= maxNode.Val {
			maxNode = node
		}
	}

	maxNode.Next = &Node{
		Val:  x,
		Next: maxNode.Next,
	}

	return aNode
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值