[leetcode] Reorder List
2014-11-14 09:05
302 查看
Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You must do this in-place without altering the nodes' values.
For example,
Given
思路是,先利用双指针找到中节点,分奇偶两种情况。然后将后半边的list倒序(用三个节点处理), 最后再将两个list合并,如果是奇数个,合并完了再补上中节点。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
# @param head, a ListNode
# @return nothing
def reorderList(self, head):
if head == None or head.next == None or head.next.next == None:
return
head1 = head
head2 = head
while head2 != None and head2.next != None:
head2 = head2.next.next
head1 = head1.next
if head2 == None:
flag = 0
newhead = head1
elif head2.next == None:
flag = 1
newhead = head1.next
curnode = newhead
if newhead.next == None:
nextnode = None
else:
nextnode = newhead.next
prevnode = None
while curnode != None:
curnode.next = prevnode
prevnode = curnode
curnode = nextnode
if nextnode != None:
nextnode = nextnode.next
newhead = prevnode
prenode = head
postnode = newhead
while True:
pretemp = prenode.next
posttemp = postnode.next
prenode.next = postnode
if posttemp == None:
if flag == 1:
postnode.next = head1
head1.next = None
else:
postnode.next = None
break
postnode.next = pretemp
prenode = pretemp
postnode = posttemp
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-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}.
思路是,先利用双指针找到中节点,分奇偶两种情况。然后将后半边的list倒序(用三个节点处理), 最后再将两个list合并,如果是奇数个,合并完了再补上中节点。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
# @param head, a ListNode
# @return nothing
def reorderList(self, head):
if head == None or head.next == None or head.next.next == None:
return
head1 = head
head2 = head
while head2 != None and head2.next != None:
head2 = head2.next.next
head1 = head1.next
if head2 == None:
flag = 0
newhead = head1
elif head2.next == None:
flag = 1
newhead = head1.next
curnode = newhead
if newhead.next == None:
nextnode = None
else:
nextnode = newhead.next
prevnode = None
while curnode != None:
curnode.next = prevnode
prevnode = curnode
curnode = nextnode
if nextnode != None:
nextnode = nextnode.next
newhead = prevnode
prenode = head
postnode = newhead
while True:
pretemp = prenode.next
posttemp = postnode.next
prenode.next = postnode
if posttemp == None:
if flag == 1:
postnode.next = head1
head1.next = None
else:
postnode.next = None
break
postnode.next = pretemp
prenode = pretemp
postnode = posttemp
相关文章推荐
- leetcode - Reorder List
- [LeetCode] Reorder List
- [LeetCode] Reorder List
- LeetCode题解–143. Reorder List
- Leetcode: Reorder List
- leetcode -- Reorder List
- leetcode 【 Reorder List 】python 实现
- LeetCode Reorder List
- 【leetcode】【单链表】【143】Reorder List
- leetcode:Reorder List (修改链表排列不改变值) 【面试算法题】
- LeetCode Reorder List
- leetcode 日经贴,Cpp code -Reorder List
- Reorder List 链表首尾交叉排列@LeetCode
- 【LeetCode】Reorder List
- LeetCode(143) Reorder List
- leetcode || 143、Reorder List
- leetcode reorder-list(java实现)
- leetcode--Reorder List
- Reorder List - Leetcode
- leetcode刷题6:对单链表重新排序--reorder list