reorder-list——链表、快慢指针、逆转链表、链表合并

Given a singly linked list LL0→L1→…→Ln-1→Ln,
reorder it to: L0→LnL1→Ln-1→L2→Ln-2→…

You must do this in-place without altering the nodes‘ values.

For example,
Given{1,2,3,4}, reorder it to{1,4,2,3}.

由于链表尾端不干净,导致fast->next!=NULL&&fast->next->next!=NULL判断时仍旧进入循环,此时fast为野指针

1 /** 2 * Definition for singly-linked list.

 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     void reorderList(ListNode *head) {
12         if(head==NULL)
13             return;
14         ListNode *slow=head,*fast=head;//快慢指针找中点
15         while(fast->next!=NULL&&fast->next->next!=NULL){
16             fast=fast->next->next;
17             slow=slow->next;
18         }
19
20         ListNode *head1=slow->next;//逆转后半链表
21         ListNode *left=NULL;
22         ListNode *right=head1;
23         while(right!=NULL){
24             ListNode *tmp=right->next;
25             right->next=left;
26             left=right;
27             right=tmp;
28         }
29         head1=left;
30
31         merge(head,head1);//合并两个链表
32     }
33     void merge(ListNode *left, ListNode *right){
34         ListNode *p=left,*q=right;
35         while(q!=NULL&&p!=NULL){
36             ListNode * nxtleft=p->next;
37             ListNode * nxtright=q->next;
38             p->next=q;
39             q->next=nxtleft;
40             p=nxtleft;
41             q=nxtright;
42         }
43     }
44 };
时间: 2024-10-13 22:24:03

reorder-list——链表、快慢指针、逆转链表、链表合并的相关文章

利用快慢指针快速得到链表中间节点

//利用快慢指针快速得到链表中间节点 int getMiddleNodeValue(LIST * l) { NODE * search, * middle; search = l->head; middle = l->head; while (NULL != search->next) { if (NULL != search->next->next) { search = search->next -> next; middle = middle->nex

一文学会链表快慢指针解题技巧

前言 上文 我们详细地学习了链表的基本概念,优缺点,也带大家一步步由浅入深地学习了链表的翻转技巧,这一篇我们来看看链表的另一个解题技巧:快慢指针. 快慢指针在面试中出现的概率也很大,也是务必要掌握的一个要点,本文总结了市面上常见的快慢指针解题技巧,相信看完后此类问题能手到擒来.本文将详细讲述如何用快慢指针解决以下两大类问题 寻找/删除第 K 个结点 有关链表环问题的相关解法 寻找/删除第 K 个结点 小试牛刀之一 LeetCode 876:给定一个带有头结点 head 的非空单链表,返回链表的中

单链表-快慢指针

快慢指针: 定义两个指针,一个快,一个慢,可以有多种用途.例如:快速找到位置长度单链表中的中间结点:对于循环链表中利用快慢指针也可以判断是否存在环. 快速找到位置长度单链表中的中间结点 1)使用一个指针,先索引一遍获取总长度,再取长度一半去循环获取到中间值:O(3L/2). 2)使用两个指针,快指针和慢指针,快指针一次向前走2格,慢指针一次走一格,当快指针走完全程,慢指针正好走在中间:O(L/2). 代码实现: //快速查找中间元素 int FindMidEle(LinkList L, Elem

链表有环判断,快慢指针两种方法/合并链表/删除重复元素/二分递归和while

public static boolean hasCycle(ListNode head) { if (head == null || head.next == null) { return false; } ListNode slow = head; ListNode fast = head.next; while (slow != fast) { if (slow.next == null) return false; slow = slow.next; if (fast.next == n

快慢指针的应用

1.判断单链表是否存在环 1 * Definition for singly-linked list. 2 * public class ListNode { 3 * public int val; 4 * public ListNode next; 5 * public ListNode(int x) { 6 * val = x; 7 * next = null; 8 * } 9 * } 10 */ 11 public class Solution { 12 public bool HasCy

快慢指针原理--快速找到未知长度单链表的中间节点

package com.java.dataStruct; //节点类 public class Node<E> { E item; Node next; public Node(){ } public Node(E element){ this.item = element; } public Node(E element, Node next){ this.item = element; this.next = next; } } Node p1,r1; Node L1 = new Node

求单链表的中间节点,用快慢指针

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Node* findMid(Node* &head) {     if(head == NULL||head->next == NULL)         return head;          Node* p = head;     Node* q = head;     while(q->next->next&&(q = q->next))     {         p = p-

快慢指针,怎样快速获取链表的中间元素

有一个链表,怎样快速获取中间节点的元素. 方法1 遍历一下链表,确认长度,获取中间的节点元素,时间复杂度O(N) 方法2 设置两个指针,一个遍历p->nexr  一个 p->next->next,快慢指针的思想  时间复杂度为O(n/2) 代码: 1 //腾讯面试题,获取一个单链表的中间位置 2 Status GetMidNode(LinkList L,ElemType *e) 3 { 4 LinklList search,mid; 5 mid =search=L; 6 while (s

sort-list——链表、快慢指针找中间、归并排序

Sort a linked list in O(n log n) time using constant space complexity. 链表,快慢指针找中点,归并排序. 注意判断条件fast->next!=NULL&&fast->next->next!=NULL,若为fast!=NULL&&fast->next!=NULL则会出现内存溢出 1 /** 2 * Definition for singly-linked list. 3 * stru