LeetCode 143.重排链表(c++)

87 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情

前言

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

143.重排链表

给定一个单链表 L 的头节点 head ,单链表 L 表示为:

L0 → L1 → … → Ln - 1 → Ln

请将其重新排列后变为:

L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …

不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例 1:

输入: head = [1,2,3,4]
输出: [1,4,2,3]

示例 2:

输入: head = [1,2,3,4,5]
输出: [1,5,2,4,3]

提示:

  • 链表的长度范围为 [1, 5 * 104]
  • 1 <= node.val <= 1000

二、思路分析

reference binding to misaligned address 0xbebebebebebec0b6 for type 'ListNode',which requires 8 byte alignaent (stl_deque. h)0xbebebebebebec0b6: note: pointer points here*

该错误表示堆栈溢出,当堆栈为空时,使用stk.top()并不为空而是为-1,因此在判定栈是否为空时可以用stk.size()>1来进行判断。

遇到这个题,我首先想到了栈,创建一个栈,把结点都存进去,那么取出来的第一个结点就是Ln,后面再清逻辑就行了。不过这个过程真的很烧脑。

我还犯了两个错,一个是上面的堆栈溢出,另一个是在修改了链表中结点的next后,最后一个结点的next忘了给NULL,导致不停地报错,我也迷茫了很久,看别人的解法流程才明白错在了哪里。

别人有的是创建了一个数组容器去做的,因为有序号,我感觉过程麻烦一点,但逻辑上更容易让人理解。

三、AC代码

class Solution {
public:
    void reorderList(ListNode* head) {
        ListNode* p=new ListNode();
        ListNode* q=new ListNode();
        p=head->next;
        stack<ListNode*>stk;
        while(p!=NULL){
            stk.push(p);
            p=p->next;
        }
        p=head;
        if (head == nullptr||stk.size()<=1) {
            return;
        }
        while(p!=q&&stk.size()>1){
            q=stk.top();
            q->next=p->next;
            p->next=q;
            p=q->next;
            stk.pop();
        }
        p->next=NULL;
    }
};

提交排名

image.png

四、总结

这是为数不多我自己有思路且能实现并做出来的题目,值得纪念,说明还是有进步的!