LC.148.Sort List

本文介绍了一种使用归并排序思想实现的链表排序算法,该算法可以在O(nlogn)的时间复杂度内完成排序,并且仅使用常数级别的额外空间。文章通过递归的方式将链表分为两半,再分别对这两部分进行排序,最后合并两个有序链表得到最终排序结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://leetcode.com/problems/sort-list/description/
Sort a linked list in O(n log n) time using constant space complexity.
找到中点之后的处理,和 143 "Reorder List" 是一样的 : 然后把tail 传后面去
ListNode tail = mid.next ;
//cut it off
mid.next = null ;

time: o(nlogn) space: o(n): recursive with n stacks
 1 public ListNode sortList(ListNode head) {
 2         if (head == null || head.next == null) return head ;
 3         //merge sort
 4         //find the mid,
 5         ListNode mid = getMid(head) ;
 6         ListNode tail = mid.next ;
 7         //cut it off
 8         mid.next = null ;
 9         //recursive
10         ListNode firstHead = sortList(head) ;
11         ListNode secHead = sortList(tail) ;
12         //merge: same logic as merge two sorted list
13          ListNode newHead = merge(firstHead, secHead);
14          return newHead;
15     }
16 
17     private ListNode merge(ListNode firstHead, ListNode secHead) {
18         ListNode dummy = new ListNode(0) ;
19         ListNode curr = dummy ;
20         while (firstHead != null && secHead != null){
21             if (firstHead.val<secHead.val){
22                 curr.next = firstHead ;
23                 firstHead = firstHead.next ;
24                 curr = curr.next ;
25             } else{
26                 curr.next = secHead ;
27                 secHead = secHead.next ;
28                 curr = curr.next ;
29             }
30         }
31         //corner case: either one side left
32         if (firstHead!=null){
33             curr.next = firstHead ;
34         }
35         if (secHead != null){
36             curr.next = secHead ;
37         }
38         return dummy.next ;
39     }
40 
41     private ListNode getMid(ListNode head){
42         if (head == null ) return head ;
43         ListNode fast = head , slow = head ;
44         while(fast != null && fast.next != null && fast.next.next != null){
45             fast = fast.next.next ;
46             slow = slow.next ;
47         }
48         return slow ;
49     }

 

转载于:https://www.cnblogs.com/davidnyc/p/8471352.html

package com.lc.bailingbird.home; import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.graphics.Typeface; import android.os.Build; import android.util.Log; import android.view.MotionEvent; import android.view.View; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.github.mikephil.charting.components.AxisBase; import com.github.mikephil.charting.components.XAxis; import com.github.mikephil.charting.components.YAxis; import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.data.LineData; import com.github.mikephil.charting.data.LineDataSet; import com.github.mikephil.charting.formatter.ValueFormatter; import com.github.mikephil.charting.highlight.Highlight; import com.github.mikephil.charting.interfaces.datasets.ILineDataSet; import com.github.mikephil.charting.utils.MPPointD; import com.lc.bailingbird.R; import com.lc.bailingbird.api.ApiWrapper; import com.lc.bailingbird.api.NetworkSubscriber; import com.lc.bailingbird.base.BaseActivity; import com.lc.bailingbird.databinding.ActivityReportDetailBinding; import com.lc.bailingbird.entity.AddReportEntity; import com.lc.bailingbird.entity.CommonEntity; import com.lc.bailingbird.entity.ReportDetailEntity; import com.llw.network.core.ApiException; import com.zcx.helper.view.toast.ToastUtils; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; public class ReportDetailActivity extends BaseActivity<ActivityReportDetailBinding> { private TreeMap<Integer, Integer> leftEarData = new TreeMap<>(); private TreeMap<Integer, Integer> rightEarData = new TreeMap<>(); private TreeMap<Integer, String> frequencies = new TreeMap<>(); // private final int[] fixedFrequencies=null; private List<Integer> fixedFrequencies; private ReportDetailEntity.DetailBean data; public static void start(Context context, String id) { Intent starter = new Intent(context, ReportDetailActivity.class); starter.putExtra("id", id); context.startActivity(starter); } @Override protected void iniClick() { binding.btnAiDebug.setOnClickListener(this::onWidgetClick); binding.btnHandDebug.setOnClickListener(this::onWidgetClick); } @Override public void onWidgetClick(View view) { super.onWidgetClick(view); int id = view.getId(); if (id == R.id.btn_ai_debug) { //AI调试 } else if (id == R.id.btn_hand_debug) { //精细调节 DeviceControlActivity.start(this, ""); } } @Override public void iniData() { super.iniData(); // ApiWrapper.get().getReportDetail(getIntent().getStringExtra("id")) ApiWrapper.get().getReportDetail("15") .subscribe(new NetworkSubscriber<ReportDetailEntity>() { @Override public void onSuccess(ReportDetailEntity bean) { data = bean.getData(); initializeData(); } @Override public void onFail(ApiException e) { //请求失败 super.onFail(e); ToastUtils.show(e.getError_msg()); // dismissProgressView(); } }); } @Override public void iniView() { super.iniView(); binding.topbar.setTitle("听力测试报告").setTypeface(Typeface.DEFAULT_BOLD); binding.topbar.addLeftImageButton(R.mipmap.ic_back, R.id.tv).setOnClickListener(view -> finish()); } private void initializeData() { //根据返回数据来绘制折线图 // 初始化固定频率点的默认值 if (data.getHearingImgList().size() == 1) { for (ReportDetailEntity.DetailBean.HearingItem.ValueItem item : data.getHearingImgList().get(0).getHearingImgValueList()) { if (data.getHearingImgList().get(0).getTestSubject() == 1) { leftEarData.put(item.getFrequency(), item.getDecibelLevel()); frequencies.put(item.getFrequency(), ""); } else { rightEarData.put(item.getFrequency(), item.getDecibelLevel()); frequencies.put(item.getFrequency(), ""); } } } else if (data.getHearingImgList().size() == 2) { for (ReportDetailEntity.DetailBean.HearingItem.ValueItem item : data.getHearingImgList().get(0).getHearingImgValueList()) { leftEarData.put(item.getFrequency(), item.getDecibelLevel()); frequencies.put(item.getFrequency(), ""); } for (ReportDetailEntity.DetailBean.HearingItem.ValueItem item : data.getHearingImgList().get(1).getHearingImgValueList()) { rightEarData.put(item.getFrequency(), item.getDecibelLevel()); frequencies.put(item.getFrequency(), ""); } } fixedFrequencies = new ArrayList<>(frequencies.keySet()); Log.e("TAG折线图底部", leftEarData.toString() + rightEarData.toString()); Log.e("TAG折线图", frequencies.keySet().toString()); setupChart(); loadData(); } private void setupChart() { // X轴配置 (对数坐标) XAxis xAxis = binding.lineChart.getXAxis(); xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); xAxis.setAvoidFirstLastClipping(true); // 避免首尾标签被裁剪 xAxis.setLabelCount(fixedFrequencies.size()); // 固定标签数量为10 xAxis.setLabelRotationAngle(45f); // 90度垂直 xAxis.setSpaceMin(0.5f); // 标签左右留白 xAxis.setSpaceMax(0.5f); xAxis.setGranularity(1f); xAxis.setAxisMinimum(0f); // 下限250→log200 xAxis.setAxisMaximum(fixedFrequencies.size() - 1); // 上限8000→log9000 xAxis.setValueFormatter(new ValueFormatter() { @Override public String getAxisLabel(float logValue, AxisBase axis) { int index = (int) logValue; Log.e("index",logValue+""); return (index >= 0 && index < fixedFrequencies.size()) ? formatFrequency((float) fixedFrequencies.get(index)) : ""; } }); // xAxis.setAxisMinimum(Collections.min(fixedFrequencies)); // xAxis.setAxisMaximum(Collections.max(fixedFrequencies)); // xAxis.setLabelCount(fixedFrequencies.size(), true); // xAxis.setValueFormatter(new ValueFormatter() { // @Override // public String getFormattedValue(float value) { // return String.valueOf((int) value); // } // }); Log.d("ChartDebug", "X轴范围: " + xAxis.getAxisMinimum() + " - " + xAxis.getAxisMaximum()); // Y轴配置 (分贝值) YAxis yAxis = binding.lineChart.getAxisLeft(); yAxis.setAxisMinimum(-10f); yAxis.setAxisMaximum(120f); yAxis.setLabelCount(14, true); // 固定13等分 yAxis.setInverted(true); yAxis.setGranularity(10f); yAxis.setValueFormatter(new ValueFormatter() { @Override public String getAxisLabel(float value, AxisBase axis) { return String.format(Locale.US, "%.0f", value); } }); binding.lineChart.getAxisRight().setEnabled(false); // 图表交互设置 binding.lineChart.getLegend().setEnabled(false); binding.lineChart.setVisibleXRangeMaximum(10); // 单屏最多显示10个单位 binding.lineChart.setDragEnabled(false); binding.lineChart.setScaleEnabled(false); binding.lineChart.setPinchZoom(false); binding.lineChart.setExtraOffsets(0f, 0f, 15f, 15f); // 左、上、右、下偏移; binding.lineChart.getDescription().setEnabled(false); } // 格式化频率显示 private String formatFrequency(float freq) { // if (!visibleFrequencies.contains(freq)) return ""; return freq >= 1000 ? String.format(Locale.US, "%.0fk", freq / 1000) : String.format(Locale.US, "%.0f", freq); } // 加载数据 private void loadData() { List<ILineDataSet> dataSets = new ArrayList<>(); // 左耳数据集 LineDataSet leftDataSet = new LineDataSet( createEntries(0, leftEarData), "Left Ear" ); configDataSet(leftDataSet, Color.parseColor("#097bf8"), 0); dataSets.add(leftDataSet); // 右耳数据集 LineDataSet rightDataSet = new LineDataSet( createEntries(1, rightEarData), "Right Ear" ); configDataSet(rightDataSet, Color.parseColor("#ff854d"), 1); dataSets.add(rightDataSet); binding.lineChart.setData(new LineData(rightDataSet)); binding.lineChart.invalidate(); Log.d("ChartDebug", "数据集1点数: " + leftDataSet.getEntryCount()); Log.d("ChartDebug", "数据集2点数: " + rightDataSet.getEntryCount()); } // 创建数据条目 private List<Entry> createEntries(int type, TreeMap<Integer, Integer> dataMap) { List<Entry> entries = new ArrayList<>(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { dataMap.forEach((key,value)->{ Entry entry = new Entry((float)value,(float)key); if (type == 0) { entry.setIcon(getResources().getDrawable(R.mipmap.iv_left_point)); } entries.add(entry); }); } Log.e("entries",entries.size()+""); // 按频率排序 Collections.sort(entries, (e1, e2) -> Float.compare(e1.getX(), e2.getX())); return entries; } // 数据集样式配置 private void configDataSet(LineDataSet dataSet, int color, int type) { dataSet.setColor(color); dataSet.setLineWidth(2f); dataSet.setDrawValues(false); if (type == 1) { dataSet.setCircleColor(color); dataSet.setCircleRadius(4f); dataSet.setDrawCircles(true); dataSet.setDrawCircleHole(true); } else { dataSet.setDrawCircles(false); dataSet.setDrawCircleHole(false); } dataSet.setMode(LineDataSet.Mode.LINEAR); } } 两条折线图没有绘制出来是什么原因
07-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值