Leetcode--Reorder List

来源:互联网 发布:cg软件作用 编辑:程序博客网 时间:2024/06/05 01:10

Given a singly linked list LL0L1→…→Ln-1Ln,
reorder it to: L0LnL1Ln-1L2Ln-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}.

下面的方法很笨但很好理解

如list1: 1->2->3->4

构造list1的反转链表:list2: 4->3->2->1

count计数链表共有多少个结点

list1的当前节点指向链表list2的当前节点,再把list1和list2的当前节点指向各自链表的后继节点,重复执行count/2次

处理需分奇偶


/** * 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||head->next->next==NULL)            return ;        int count=0;        ListNode * list2=NULL;        ListNode * list1=head;        while(list1!=NULL)//构建list1的逆序链表list2        {            if(list2==NULL)            {                list2=(ListNode*)malloc(sizeof(ListNode));                list2->val=list1->val;                list2->next=NULL;                count++;            }            else            {                ListNode * temp=(ListNode*)malloc(sizeof(ListNode));                temp->val=list1->val;                temp->next=list2;                list2=temp;                count++;            }            list1=list1->next;        }        list1=head;        if(count%2==0)//节点个数为偶        {            count /=2;            for(int i=1;i<=count;i++)            {                ListNode * temp1=list1->next;                ListNode * temp2=list2->next;                if(i!=count){                list1->next=list2;                list2->next=temp1;                list1=temp1;                list2=temp2;                }                else                {                    list1->next=list2;                    list2->next=NULL;                }                            }        }        else//节点个数为奇数        {            count=(count-1)/2;            for(int i=1;i<=count;i++)            {                ListNode *temp1=list1->next;                ListNode *temp2=list2->next;                list1->next=list2;                list2->next=temp1;                list1=temp1;                list2=temp2;            }            list1->next=NULL;        }            }};


0 0