美文网首页程序员坚持LeetCode
跟我坚持刷leetcode(第二天-奇偶链表)

跟我坚持刷leetcode(第二天-奇偶链表)

作者: 北极星光熊 | 来源:发表于2017-04-03 22:50 被阅读461次

    对抗惰性,从今天做起。坚持每天刷leetcode并附带一个题的题目,思路,代码。感兴趣的小伙伴一起坚持来吧(c代码,不过思路都是差不多的)。


    题目(难度中等):
    给出一个单链表,把奇数位置的节点连接在一起,后面跟着连接在一起的偶数位置节点(注意奇偶指的是节点的位置,而不是节点内的值)。时间要求:O(nodes)。
    空间要求:O(1)。
    例子:

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

    输入:1->4->6->2->3->NULL
    输出:1->6->3->4->2->NULL
    思路
    1.不好的思路:原地改变,把所有奇数位置的节点一个一个往前移动,随着移动的进行,当前奇数位到下一个奇数位之间的节点会越来越多。首先不满足时间要求,其次需要变量记录两个奇数位之间距离。
    2.正确(未必最优)思路:用两个链表,先考虑一下特殊情况(空链表或者长度为1)。
    两个链表的头结点分别是原链表的第一个和第二个节点。然后原head节点不断向后移动。第一次把节点接在第一个链表后面,第二次接在第二个链表后面。不断循环,直至head为NULL。最后把b接在a的后面。处理一下尾节点就好了。
    /其实第二种思路包含了弹出栈的数据结构/
    代码:

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     struct ListNode *next;
     * };
     */
    struct ListNode* oddEvenList(struct ListNode* head) {
        struct ListNode* a = NULL;
        struct ListNode* b = NULL;
        if(head!=NULL)
        {
            a = head;
            head = head->next;
        }
        else
        return NULL;
        if(head!=NULL)
        {
            b = head;
            head = head->next;
        }
        else
        return a;
        int i = 0;
        struct ListNode* aptr = a;
        struct ListNode* bptr = b;
        while(head!=NULL)
        {
            if(i%2==0)
            {
                aptr->next = head;
                aptr = aptr->next;
                head = head->next;
            }
            else
            {
                bptr->next = head;
                bptr = bptr->next;
                head = head->next;
            }
            i++;
        }
        aptr->next = b;
        bptr->next = NULL;
        return a;
    }
    

    相关文章

      网友评论

        本文标题:跟我坚持刷leetcode(第二天-奇偶链表)

        本文链接:https://www.haomeiwen.com/subject/exaoottx.html