148. Sort List (M)

本文介绍了一种在链表上实现归并排序的方法,通过快慢指针找到中点,将链表分为两部分,递归排序后再合并,达到O(nlogn)的时间复杂度,且仅使用常数空间。

Sort List (M)

Sort a linked list in O(n log n) time using constant space complexity.

Example 1:

Input: 4->2->1->3
Output: 1->2->3->4

Example 2:

Input: -1->5->3->4->0
Output: -1->0->3->4->5

题意

将链表排序,要求不能使用额外空间,且时间复杂度为O(NlogN)O(NlogN)O(NlogN)

思路

链表不好操作快排和堆排,使用归并排序(分治法):每次利用快慢指针找到链表的中间位置,将其断开为左右两个子链表,待这两个子链表排序后,利用归并将它们再重新合并为一个有序链表。递归处理。


代码实现

class Solution {
    public ListNode sortList(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }

        ListNode slow = head, fast = head;
        while (fast.next != null && fast.next.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        ListNode mid = slow.next;
        slow.next = null;
        return merge(sortList(head), sortList(mid));
    }

    private ListNode merge(ListNode head1, ListNode head2) {
        ListNode head = new ListNode(0);
        ListNode cur = head;
        while (head1 != null && head2 != null) {
            if (head1.val < head2.val) {
                cur.next = head1;
                head1 = head1.next;
            } else {
                cur.next = head2;
                head2 = head2.next;
            }
            cur = cur.next;
        }
        cur.next = head1 == null ? head2 : head1;
        return head.next;
    }
}
在 Elasticsearch Java DSL 中,可以通过 `bool` 查询结合 `function_score` 或 `boost` 参数来影响评分,并在查询结果中基于评分进行排序。`bool` 查询本身并不直接参与评分计算,但其内部的 `must`、`should`、`must_not` 等子句可以通过权重调整影响最终评分。在构建查询时,可以将 `function_score` 查询嵌套在 `bool` 查询中,从而实现更灵活的评分控制[^1]。 以下是一个示例,展示如何在 `bool` 查询中添加评分支持,并基于评分对结果进行排序: ```java import co.elastic.clients.elasticsearch.core.Search; import co.elastic.clients.elasticsearch._types.query_dsl.*; import co.elastic.clients.elasticsearch._types.SortOrder; import java.io.IOException; Query query = Query.of(q -> q .bool(b -> b .must(m -> m.term(t -> t.field("localLanguage").value("en"))) .must(m -> m.term(t -> t.field("status").value(0))) .must(m -> m.term(t -> t.field("deleted").value(0))) .should(s -> s.match(m -> m.field("fileMapperName").query("search"))) .should(s -> s.match(m -> m.field("fileContent").query("search"))) .should(s -> s.match(m -> m.field("fileOriginKeyword").query("search"))) .filter(f -> f.range(r -> r.field("fileOriginRange").lte(JsonData.of(1)))) .minimumShouldMatch("1") ) .functionScore(fs -> fs .functions(f -> f .filter(f1 -> f1.match(m -> m.field("fileMapperName").query("search"))) .weight(2.0) ) .scoreMode(FunctionScoreMode.Sum) .boostMode(FunctionBoostMode.Replace) ) ); Search.Builder searchBuilder = Search.of(b -> b .query(query) .sort(s -> s .field(f -> f .field("_score") .order(SortOrder.Desc) ) ) ); ``` 在上述代码中,`function_score` 被用于提升特定匹配字段的评分权重,例如 `fileMapperName` 中包含 `"search"` 的文档将获得更高的评分。同时,查询结果通过 `_score` 字段进行降序排序,以确保评分高的文档优先返回。 此外,还可以结合 `boost` 参数在 `should` 子句中直接提升匹配项的权重: ```java Query query = Query.of(q -> q .bool(b -> b .must(m -> m.term(t -> t.field("localLanguage").value("en"))) .must(m -> m.term(t -> t.field("status").value(0))) .must(m -> m.term(t -> t.field("deleted").value(0))) .should(s -> s.match(m -> m.field("fileMapperName").query("search")).boost(2.0)) .should(s -> s.match(m -> m.field("fileContent").query("search")).boost(1.5)) .should(s -> s.match(m -> m.field("fileOriginKeyword").query("search")).boost(1.0)) .filter(f -> f.range(r -> r.field("fileOriginRange").lte(JsonData.of(1)))) .minimumShouldMatch("1") ) ); Search.Builder searchBuilder = Search.of(b -> b .query(query) .sort(s -> s .field(f -> f .field("_score") .order(SortOrder.Desc) ) ) ); ``` 通过 `boost` 参数,可以为不同的 `should` 匹配项分配不同的权重,从而影响最终的评分排序结果。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值