码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode OJ Linked List: 24题、148题和61题

时间:2015-03-22 00:17:31      阅读:268      评论:0      收藏:0      [点我收藏+]

标签:

题外话:最近打算做一些LeetCode OJ上面的练习题了,当然很多前辈都已经写过若干解题报告了。坦白说,也正是因为前辈们的贡献,才让我们学习到了很多知识。所以,我一直都在犹豫到底要不要写解题报告多此一举呢?当然,我水平很渣啊。我觉得虽然,有很多很好的解题报告可参考了,但是自己对待这件事的态度又是另外一回事,记录下来,完全是提醒自己这段时间是有计划的,是要做题的。

 

24题:Swap Nodes in Pairs

技术分享

题目分析:链表长度为奇数时,最后一个节点不用再调整啦。当然了,不能改变节点的值,否则,你还玩不玩了?

技术分享
class Solution 
{
public:
    ListNode *swapPairs(ListNode *head) 
    {
        if (head == NULL || head->next == NULL)
        {
            return head;
        }

        ListNode tmpNode(-1);

        ListNode *pre = &tmpNode, *cur, *next;

        for (cur = head, next = cur->next; next; pre = cur, cur = cur->next, next = cur ? cur->next : NULL)
        {
            pre->next = next;
            cur->next = next->next;
            next->next = cur;
        }

        return tmpNode.next;
    }
};
View Code

 

148题:Sort List

技术分享

题目分析:从时间性能上看,貌似不能用快速排序,快速排序的期望性能是nlogn的,所以归并排序应该是比较容易想到的。

技术分享
class Solution 
{
public:
    ListNode* MergeList(ListNode *lList, ListNode *rList)
    {
        ListNode tmpNode(-1);
        ListNode *tmp = &tmpNode;

        while (lList != NULL && rList != NULL)
        {
            if (lList->val < rList->val)
            {
                tmp->next = lList;
                lList = lList->next;
            }
            else
            {
                tmp->next = rList;
                rList = rList->next;
            }

            tmp = tmp->next;
        }

        if (lList != NULL)
        {
            tmp->next = lList;
        }

        if (rList != NULL)
        {
            tmp->next = rList;
        }

        return tmpNode.next;
    }

    ListNode* sortList(ListNode *head)
    {
        if (head == NULL || head->next == NULL)
        {
            return head;
        }

        //利用快慢指针找到中间位置
        ListNode *fast = head, *slow = head;
        while (fast->next != NULL && fast->next->next != NULL)
        {
            fast = fast->next->next;
            slow = slow->next;
        }

        //分割为两个链表
        fast = slow->next;
        slow->next = NULL;

        ListNode *lList = sortList(head);
        ListNode *rList = sortList(fast);

        return MergeList(lList, rList);
    }
};
View Code

 

61题:Rotate List

技术分享

题目分析:我只能说千万不要很实在地移动k个节点,就像上面的例子,k=5,k=10,...这不都是与没移动一个效果么。另外,那个不用一步一移,可以最后找到合适位置断开即可。

技术分享
class Solution {
public:
    ListNode* rotateRight(ListNode *head, int k)
    {
        if (head == NULL || head->next == NULL)
        {
            return head;
        }

        //计算长度
        ListNode *p = head;
        int lenList = 1;
        while (p->next != NULL)
        {
            p = p->next;
            lenList += 1;
        }

        p->next = head;
        int step = lenList - k % lenList;
        for (int i = 0; i < step; ++i)
        {
            p = p->next;
        }

        //断开
        head = p->next;
        p->next = NULL;

        return head;
    }
};
View Code

LeetCode OJ Linked List: 24题、148题和61题

标签:

原文地址:http://www.cnblogs.com/mengwang024/p/4356393.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!