zoukankan      html  css  js  c++  java
  • Leetcode0143--Reorder List 链表重排

    【转载请注明】https://www.cnblogs.com/igoslly/p/9351564.html

    具体的图示可查看 链接


    代码一

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        void reorderList(ListNode* head) {
            if(head==NULL || head->next ==NULL) return;
            // two pointers split the list
            // 快慢指针,快指针到尾时,慢指针在前list尾部
            // example: 1->2->3->4->5 fast=5,slow=3, 1->2->3 & 4->5
            // example: 1->2->3->4    fast=3,slow=2, 1->2    & 3->4
            ListNode *slow = head, *fast = head;
            while(fast->next !=NULL && fast->next->next !=NULL){
                slow = slow ->next;
                fast = fast->next->next;
            }
            ListNode *head1 = head;
            // reverse the second list(with large numbers)
            // 翻转第二个链表
            ListNode *head2 = reverseList(slow->next);
            slow->next = NULL;
            while(head2!=NULL){             // list1 size >= list2 size
                ListNode *next1 = head1->next;
                ListNode *next2 = head2->next;
                head1->next = head2;
                head2->next = next1;
                head1 = next1;
                head2 = next2;
            }
            if(head1!=NULL){
                head1->next = NULL;
            }
        }
        // reverse list
        ListNode *reverseList(ListNode *head){
            if(head==NULL || head->next ==NULL) return head;
            ListNode * new_head = NULL;
            while(head!=NULL){
                ListNode *pNext = head->next;
                head->next = new_head;
                new_head = head;
                head = pNext;
            }
            return new_head;
        }
    };

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        void reorderList(ListNode* head) {
            stack<ListNode* > nodestack;
            int length=0;
            // 计算链表长度,结点压入stack
            ListNode *temp = head;
            while(temp){
                length++;
                nodestack.push(temp);
                temp = temp->next;
            }
            // 栈弹出,连接链表
            temp = head;
            int cnt = length/2;
            while(cnt){
                ListNode *head2 = nodestack.top();
                nodestack.pop();
                ListNode *headNext = temp->next;
                temp->next =head2;
                head2->next = headNext;
                temp = headNext;
                cnt--;
            }
            // 总数为odd,temp指向末尾元素
            // 总数为even,temp会和前元素重复,此处删除
            if(length%2){
                temp->next = NULL;
            }else{
                temp = NULL;
            }
        }
    };
  • 相关阅读:
    如何在magento添加推荐分类
    Apache和iis的冲突处理
    怎么在windows7下搭建服务器
    centos dns配置
    wget net-tools
    centos7 ip地址设置
    centos 7 u盘安装
    centos7 u盘启动路径设置
    screen 命令
    lnmp重置mysql密码
  • 原文地址:https://www.cnblogs.com/igoslly/p/9351564.html
Copyright © 2011-2022 走看看