二刷LeetCode--148. 排序鏈表(C++版本),必會題,思維題

思路,本題其實考察了兩個點:合并鏈表、鏈表切分。首先從1開始,將鏈表切成一段一段,因為需要使用歸并,所以下一次的切分長度應該是當前切分長度的二倍,每次切分,我們拿出兩段,然后將第三段的開頭賦值給一個指針,合并前面兩段,下一次繼續從第三段開始切分,然后繼續合并。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* sortList(ListNode* head) {// 定義虛擬頭節點,注意這里不是結構體指針類型ListNode dummyhead(0);// 指針處理,這里使用點而不是箭頭,虛擬頭節點之后的節點是頭節點dummyhead.next = head;int len = 0;ListNode *p = head;// 計算鏈表長度while(p){++len;p = p -> next;}// 開始切割鏈表,從短的開始逐漸合成長的// 注意size每次增加長度為之前的兩倍(左移一位)for(int size = 1;size < len;size <<= 1){ListNode *cur = dummyhead.next;ListNode *tail = &dummyhead;while(cur){// 切下來一段鏈表節點ListNode *left = cur;// right是下一段鏈表的初始節點ListNode *right = cut_list(left, size);// 從下一段鏈表開始,繼續切cur = cut_list(right, size);// 切分之后開始進行合并,比如首先合并left,right為首的這兩段tail -> next = merge(left, right);// 當下一個位置不為空的時候繼續進行游走,直到(合并好的鏈表的)末尾while(tail -> next){tail = tail -> next;}}}return dummyhead.next;}ListNode *cut_list(ListNode *head, int n){int size = n;ListNode *p = head;// 如果需要切的size是1,那么就不需要裁切,所以首先對size進行自減while(--size && p){p = p -> next;} // 如果走到頭了,就返回空if(p == nullptr)return nullptr;// 如果不為空,就把p節點之后的節點進行處理ListNode *next = p -> next;p -> next = nullptr;// 返回被切分的下一個節點的位置return next;}ListNode *merge(ListNode *l1, ListNode *l2){// 虛擬頭節點ListNode dummyhead(0);ListNode *p = &dummyhead;// 當二者都不為空的時候開始歸并while(l1 && l2){// 選擇較小的進行尾插if(l1 -> val <= l2 -> val){p -> next = l1;p = p -> next;// 尾插結束之后游標后移l1 = l1 -> next;}else{p -> next = l2;p = p -> next;// 尾插結束之后游標后移l2 = l2 -> next;}}if(l1)p -> next = l1;if(l2)p -> next = l2;// 因為是虛擬頭節點,所以返回第一個數據節點return dummyhead.next;}
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40302.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40302.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40302.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

虛擬機與Java虛擬機介紹

1、虛擬機 所謂虛擬機&#xff08;Virtual Machine&#xff09;&#xff0c;就是一臺虛擬的計算機。它是一款軟件&#xff0c;用來執行一系列虛擬計算機指令。大體上&#xff0c;虛擬機可以分為系統虛擬機和程序虛擬機。大名鼎鼎的Visual Box&#xff0c;VMware就屬于 系統虛…

提示丟失vcomp140.dll怎么辦?如何快速修復vcomp140.dll丟失問題

最近我遇到了一個程序啟動失敗的問題&#xff0c;錯誤提示顯示缺少了vcomp140.dll文件。經過一番研究和嘗試&#xff0c;我終于成功修復了這個問題。在這里&#xff0c;我將分享一下我的修復方法。 目錄 vcomp140.dll是什么&#xff1f; 如何快速修復呢&#xff1f; vcomp140…

sCrypt編程馬拉松于8月13日在復旦大學成功舉辦

繼6月在英國Exeter大學成功舉辦了為期一周的區塊鏈編程馬拉松后&#xff0c;美國sCrypt公司創始人兼CEO劉曉暉博士帶領核心團隊成員王一強、鄭宏鋒、周全&#xff0c;于8月13日在復旦大學再次成功舉辦了一場全新的sCrypt編程馬拉松。 本次活動由上海可一澈科技有限公司與復旦大…

C++筆記之花括號和圓括號初始化區別,列表初始化和初始化列表區別

C筆記之花括號和圓括號初始化區別&#xff0c;列表初始化和初始化列表區別 code review! 文章目錄 C筆記之花括號和圓括號初始化區別&#xff0c;列表初始化和初始化列表區別1.花括號{}進行初始化和圓括號()進行初始化2.列表初始化&#xff08;list initialization&#xff0…

Vitis高層次綜合學習——FPGA

高層次綜合 什么是高層次綜合&#xff1f;就是使用高級語言&#xff08;如C/C&#xff09;來編寫FPGA算法程序。 在高層次綜合上并不需要制定微架構決策&#xff0c;如創建狀態機、數據路徑、寄存器流水線等。這些細節可以留給 HLS 工具&#xff0c;通過提供輸入約束&#xff…

專訪阿里云席明賢,視頻云如何運用大模型與小模型來破繭升級2.0

不久前&#xff0c;LiveVideoStack與阿里云視頻云負責人席明賢&#xff08;花名右賢&#xff09;展開一場深度的對話&#xff0c;一個是圈內專業的社區媒體&#xff0c;一個是20年的IT老兵&#xff0c;雙方有交集、有碰撞、有火花。 面對風云變幻的內外環境&#xff0c;阿里云…

未來數字銀行的樣子

對銀行長期發展來講&#xff0c;這意味著將關閉和減少 低效率的實體分行&#xff0c;加速向數字化發展。實現成本節省和 IT 預算提效的需求&#xff0c;將為數字柜臺和銀行代理點創造新的機遇。 一個嶄新的世界&#xff1a;未來數字銀行趨勢圖 現在是銀行迎頭趕上并為客戶提供超…

拿來即用,自己封裝的 axios

文章目錄 一、需求二、分析1. 安裝axios2. 新建一個 ts 文件&#xff0c;封裝 axios3. store 存放 token 信息4. 使用5. 文件 type.js 一、需求 在日常開發中&#xff0c;我們會經常用到 axios &#xff0c;那么如何在自己的項目中自己封裝 axios 二、分析 1. 安裝axios np…

jenkins使用

安裝插件 maven publish over ssh publish over ssh 會將打包后的jar包&#xff0c;通過ssh推送到指定的服務器上&#xff0c;&#xff0c;在jenkins中設置&#xff0c;推送后腳本&#xff0c;實現自動部署jar包&#xff0c;&#xff0c; 裝了這個插件之后&#xff0c;可以在項…

非計算機科班背景者順利轉碼計算機領域:策略與前景展望

方向一&#xff1a;如何規劃才能實現轉碼&#xff1f; 對于非計算機科班背景的人想要順利轉碼進入計算機領域&#xff0c;規劃是至關重要的。以下是一些建議&#xff0c;可以幫助你在轉碼過程中更加順利&#xff1a; 自我評估和目標設定&#xff1a; 首先&#xff0c;你需要明…

Weak Session IDs (弱會話)

Weak Session IDs (弱會話) 當用戶登錄后&#xff0c;在服務器就會創建一個會話(session)&#xff0c;叫做會話控制&#xff0c;接著訪問頁面的時候就不用登錄&#xff0c;只需要攜帶Sesion去訪問。 sessionID作為特定用戶訪問站點所需要的唯一內容。如果能夠計算或輕易猜到該…

深入理解 Flutter 圖片加載原理

作者&#xff1a;京東零售 徐宏偉 來源&#xff1a;京東云開發者社區 前言 隨著Flutter穩定版本逐步迭代更新&#xff0c;京東APP內部的Flutter業務也日益增多&#xff0c;Flutter開發為我們提供了高效的開發環境、優秀的跨平臺適配、豐富的功能組件及動畫、接近原生的交互體驗…

用對角線去遍歷矩陣

聲明 該系列文章僅僅展示個人的解題思路和分析過程&#xff0c;并非一定是優質題解&#xff0c;重要的是通過分析和解決問題能讓我們逐漸熟練和成長&#xff0c;從新手到大佬離不開一個磨練的過程&#xff0c;加油&#xff01; 原題鏈接 用對角線遍歷矩陣https://leetcode.c…

wsl2(debian)安裝python的不同版本例如3.8

要在Debian上安裝 Python 3.8&#xff0c;可以按照以下步驟操作&#xff1a; 1.確保你的 Debian 系統已經更新到最新版本&#xff0c;可以使用以下命令更新&#xff1a; sudo apt update sudo apt upgrade2.安裝 Python 3.8 的依賴項&#xff0c;以及構建 Python 時需要的工具…

django中實現事務的幾種方式

1.實現事務的三種方式 1.1 全局開啟事務---> 全局開啟事務&#xff0c;綁定的是http請求響應整個過程 DATABASES {default: {#全局開啟事務&#xff0c;綁定的是http請求響應整個過程ATOMIC_REQUESTS: True, }} from django.db import transaction# 局部禁用事務 transac…

數據結構——棧(C語言)

需求&#xff1a;無 棧的概念&#xff1a; 棧&#xff1a;一種特殊的線性表&#xff0c;其只允許在固定的一端進行插入和刪除元素操作。進行數據插入和刪除操作的一端稱為棧頂&#xff0c;另一端為棧底。棧中的數據元素遵守后進先出&#xff08;LIFO&#xff09;原則。壓棧&…

GPIO 配置 和 PINCTRL有啥區別

GPIO&#xff08;通用輸入/輸出&#xff09;和 PINCTRL&#xff08;引腳控制器&#xff09;是在嵌入式系統中用于管理和控制硬件引腳的關鍵概念。它們在硬件層面上起著不同的作用。 GPIO配置&#xff1a; GPIO 是一種通用的硬件接口&#xff0c;用于控制和讀取數字信號。每個 …

自動駕駛——駛向未來的革命性技術

自動駕駛——駛向未來的革命性技術 自動駕駛的組件自動駕駛的優勢自動駕駛的應用自動駕駛的未來中國的自動駕駛 自動駕駛是一種技術&#xff0c;它允許車輛在沒有人類駕駛員的情況下自主地進行行駛。它利用各種傳感器、計算機視覺、人工智能和機器學習算法來感知和理解周圍環境…

.net連接mysql,提示找不到請求的 .Net Framework Data Provider。可能沒有安裝

開發完成的.net程序需要連接mysql數據庫&#xff0c;在個人電腦上運行沒問題&#xff0c;別人運行時提示“提示找不到請求的 .Net Framework Data Provider。可能沒有安裝”。經過查詢&#xff0c;安裝Connector/NET 8.1.0&#xff0c;下載地址如下所示&#xff1a; https://d…

Linux touch 命令指南大全

1. 概述 在本教程中,我們將學習touch命令。簡而言之,這個命令允許我們更新文件或目錄的最后修改時間和最后訪問時間。 因此,我們將重點關注如何使用該命令及其各種選項。 請注意,我們使用 Bash 測試了此處顯示的所有命令;但是,它們應該與任何兼容 POSIX 的 shell 一起使…