题目
重排链表
给定一个单链表L: L0→L1→…→Ln-1→Ln,
重新排列后为:L0→Ln→L1→Ln-1→L2→Ln-2→…
必须在不改变节点值的情况下进行原地操作
样例
给出链表1->2->3->4->null,重新排列后为1->4->2->3->null。
分析
该题目要求将链表后半段逆序逐个插入前半段每个节点后。且不能占用其他存储结构。
我的解决办法呢,就是先将链表整体一分为二,然后将后半段链表逆序,再依次插入前半段节点中。
我们知道利用快慢指针的思想很容易能够找到链表中的中间节点;链表逆序可以采用前插法,O(n)即可解决。所以该题目的总体时间复杂度为O(n)。
C++代码
/*
99 重排链表
给定一个单链表L: L0→L1→…→Ln-1→Ln,
重新排列后为:L0→Ln→L1→Ln-1→L2→Ln-2→…
必须在不改变节点值的情况下进行原地操作
样例
给出链表1->2->3->4->null,重新排列后为1->4->2->3->null。
*/
/**
* Definition of ListNode
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param head: The first node of linked list.
* @return: void
*/
void reorderList(ListNode *head) {
// write your code here
if(head == NULL || head->next == NULL)
{
return ;
}//if
ListNode *p = head, *q = head->next;
while(q && q->next)
{
p = p->next;
q = q->next->next;
}//while
q = p->next;
p->next = NULL;
//后半段节点先逆序再逐个插入
ListNode *rHead = NULL;
while(q)
{
ListNode *r = q->next;
q->next = rHead;
rHead = q;
q = r;
}//while
q = rHead;
p = head;
while(p&&q)
{
ListNode *rr = q->next;
ListNode *lr = p->next;
q->next = lr;
p->next = q;
q = rr;
p = lr;
}//while
}
};
GitHub代码链接
Python代码
遇到一个很奇怪的问题,明明我的本地测试是正确的,在网站提交,总是出现:
Runtime Error
总耗时:
25 ms
0% 数据通过测试.
输入
null
期望答案
null
错误信息
class Solution:
"""
@param head: The first node of the linked list.
@return: nothing
"""
def reorderList(self, head):
# write your code here
if head is None or head.next is None:
return
p = head
q = head.next
while q is not None and q.next is not None:
p = p.next
q = q.next.next
q = p.next
p.next = None
# 后半段节点逆序再逐个插入
rHead = None
while q is not None:
r = q.next
q.next = rHead
rHead = q
q = r
q = rHead
p = head
while p is not None and q is not None:
rr = q.next
lr = p.next
q.next = lr
p.next = q
q = rr
p = lr
GitHub完整代码链接