题目
思路:
把链表分成两半(用快慢指针)
然后反转后半部分链表
最后合并两个链表
代码:
struct ListNode* fzList(struct ListNode *head) {
struct ListNode *p = head;
struct ListNode *q = NULL;
struct ListNode *temp = NULL;
while (p != NULL) {
temp = p->next;
p->next = q;
q = p;
p = temp;
}
return q;
}
void reorderList(struct ListNode* head) {
if (head == NULL || head->next == NULL) return;
struct ListNode *p1 = head, *p2 = head, *p = NULL;
while (p2 != NULL && p2->next != NULL) {
p= p1;
p1 = p1->next;
p2 = p2->next->next;
}
p->next = NULL;
struct ListNode *t1 = head;
struct ListNode *t2 = fzList(p1);
while (t2!= NULL) {
struct ListNode *temp1 = t1->next;
struct ListNode *temp2 = t2->next;
t1->next = t2;
t2->next = temp1;
t1 = temp1;
t2 = temp2;
}
}
反思:
今天极限写题目(和女朋友去玩了哈哈哈哈)