「力扣」第 328 题:奇偶链表(中等)


「力扣」第 328 题:奇偶链表(中等)

给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。

请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。

示例 1:

输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL

示例 2:

输入: 2->1->3->5->6->4->7->NULL 
输出: 2->3->6->7->1->5->4->NULL

说明:

  • 应当保持奇数节点和偶数节点的相对顺序。
  • 链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推。

思路:题目要求原地算法完成,那么就一定得“穿针引线”了。

  • 方法1:可以使用 LeetCode 第 86 题题解思路 2 完成。
  • 方法2:同样使用两个指针,一次跳过一个节点完成“穿针引线”,特别注意要一些边界情况的判断。

LeetCode 第 328 题:奇数(Odd)偶数(Even)链表

Python 代码:

class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None


class Solution:
    def oddEvenList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """

        if head is None or head.next is None:
            return head

        # odd 奇数
        odd_head = head
        even_head = head.next

        odd_cur = odd_head
        even_cur = even_head

        while even_cur and even_cur.next:
            odd_cur.next = odd_cur.next.next
            even_cur.next = even_cur.next.next

            odd_cur = odd_cur.next
            even_cur = even_cur.next

        odd_cur.next = even_head
        return odd_head

我还写过一个题解在这里,可以参考一下。


文章作者: liweiwei1419
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 liweiwei1419 !
评论
 上一篇
「力扣」第 445 题:两数相加 II(中等) 「力扣」第 445 题:两数相加 II(中等)
「力扣」第 445 题:两数相加 II(中等) 英文网址:445. Add Two Numbers II ; 中文网址:445. 两数相加 II ; 题解地址 给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们
下一篇 
「力扣」第 237 题:删除链表中的节点(简单) 「力扣」第 237 题:删除链表中的节点(简单)
「力扣」第 237 题:删除链表中的节点(简单) 传送门:英文网址:237. Delete Node in a Linked List ; 中文网址:237. 删除链表中的节点 。 请编写一个函数,使其可以删除某个链表中给定的(非末尾)
  目录