日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【LeetCode笔记】143. 重排链表(Java、链表、栈、快慢指针)

發布時間:2024/7/23 java 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【LeetCode笔记】143. 重排链表(Java、链表、栈、快慢指针) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 題目描述
  • 思路 & 代碼
      • 更新版:快慢指針 + 翻轉鏈表

題目描述

  • 一看題目反序:用棧
  • 更新:O(1) 空間復雜度

思路 & 代碼

  • 先快慢指針,找到需要入棧的起點,然后逐個入棧
  • 然后逐個出棧,進行重排即可
  • 注意1:記得對重排后的鏈表結尾進行 Last.next = null 處理,防止成環
  • 注意2:奇偶情況要進行處理,可見代碼注釋
  • 時間復雜度 O(n) ,空間復雜度 O(n)
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/ class Solution {public void reorderList(ListNode head) {// 快慢指針ListNode now = head;// 走到需要進行入棧的位置now = head;ListNode pre = head;while(now.next != null && now.next.next != null){pre = pre.next;now = now.next.next;}// 偶數處理if(now.next != null){pre = pre.next;}now = pre.next;// 末尾處理,防止死循環pre.next = null;// 入棧Stack<ListNode> myStack = new Stack<>();while(now != null){myStack.push(now);now = now.next;}// 重排now = head;while(!myStack.isEmpty()){ListNode temp = myStack.pop();ListNode nextLoop = now.next;temp.next = now.next;now.next = temp;now = nextLoop;}} }

更新版:快慢指針 + 翻轉鏈表

class Solution {public void reorderList(ListNode head) {// 0. 特殊情況if(head == null || head.next == null) {return;}// 1. 快慢指針,劃分出兩段(注意第一段結尾的 next 置空,用 slowPreListNode slow = head, fast = head;ListNode slowPre = null;while(fast != null && fast.next != null) {slowPre = slow;slow = slow.next;fast = fast.next.next;}// 奇數,slow 為中間節點(奇偶情況處理)if(fast != null) {slowPre = slow;slow = slow.next;}// 2. 第二段的翻轉slowPre.next = null;ListNode pre = null;while(slow != null) {ListNode nextNode = slow.next;slow.next = pre;pre = slow;slow = nextNode;}// 3. 合并兩段鏈表fast = head;while(pre != null) {ListNode temp1 = fast.next;ListNode temp2 = pre.next;fast.next = pre;pre.next = temp1;fast = temp1;pre = temp2;}} }

總結

以上是生活随笔為你收集整理的【LeetCode笔记】143. 重排链表(Java、链表、栈、快慢指针)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。