leetcode143. Reorder List

用快慢双指针,可以使慢指针到达中间的时候快指针到达最后一个元素(奇数),或者倒数第二个元素(偶数)。慢指针后面的元素是后半个链表,把后半个链表进行reverse,然后再插在原来的链表中就可以了

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
	ListNode* reverse(ListNode* head)
	{
		ListNode* pre;
		ListNode* cur;
		cur = head;
		pre = NULL;
		while (cur!= NULL)
		{
			ListNode* next;
			next = cur->next;
			cur->next = pre;
			pre = cur;
			cur = next;
		}
		return pre;
	}
public:
	void reorderList(ListNode* head) {
		if (head==NULL||head->next == NULL || head->next->next == NULL)
			return;
		ListNode* fast;
		ListNode* slow;
		fast = head;
		slow = head;
		while (fast->next&&fast->next->next)//出来之后slow的下一个就是后半段.
		{
			fast = fast->next->next;
			slow = slow->next;
		}
		ListNode*q;
		q = reverse(slow->next);
		slow->next = NULL;
		ListNode*p;
		p = head;
		while (p&&q)
		{
			ListNode* temp;
			temp = new ListNode(q->val);
			temp->next=p->next; 
			p->next = temp;
			p = temp->next;
			q = q->next;
		}
		return;
	}
};

  

原文地址:https://www.cnblogs.com/legendcong/p/9719769.html