143. Reorder List

来源:互联网 发布:cms内容管理系统设计 编辑:程序博客网 时间:2024/06/12 23:21

题目:

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}.


题意:

重新排序给定的链表,只能交换节点,不能修改节点值。


思路:

1、设置快慢两个指针用来找到链表中点;

2、将中点之后的半段链表反转;

3、之后将反转的部分与前半段的链表合并即可。

代码:67ms

/** * 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==nullptr || head->next==nullptr) return;                ListNode *slow = head, *fast = head, *prev = nullptr;        while (fast && fast->next) { //用来找到链表中间节点            prev = slow;            slow = slow->next;            fast = fast->next->next;        }        prev->next = nullptr;                slow = reverseList(slow);  //反转后半段链表                ListNode *curr = head;        while (curr->next) {  //合成两段链表            ListNode *tmp = curr->next;            curr->next = slow;            slow = slow->next;            curr->next->next = tmp;            curr = tmp;        }        curr->next = slow;    }        ListNode *reverseList(ListNode *head){  //反转链表        if (head==nullptr || head->next==nullptr) return head;                ListNode *prev = head;        for(ListNode *curr = head->next, *next = curr->next; curr;                 prev = curr, curr = next, next = next ? next->next : nullptr) {                    curr->next = prev;        }        head->next = nullptr;        return prev;    }};
代码:java版:3ms

/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { val = x; } * } */public class Solution {    public void reorderList(ListNode head) {        if(head==null || head.next==null) return;                //找到链表中间节点        ListNode p1 = head;        ListNode p2 = head;        while(p2.next!=null && p2.next.next!=null){            p1 = p1.next;            p2 = p2.next.next;        }                //反转中间节点之后的链表        ListNode preMiddle = p1;        ListNode preCurrent = p1.next;        while(preCurrent.next!=null){            ListNode current = preCurrent.next;            preCurrent.next = current.next;            current.next = preMiddle.next;            preMiddle.next = current;        }                //合成两段子链表        p1 = head;        p2 = preMiddle.next;        while(p1!=preMiddle){            preMiddle.next = p2.next;            p2.next = p1.next;            p1.next = p2;            p1 = p2.next;            p2 = preMiddle.next;        }    }}

0 0
原创粉丝点击