167. 两数之和 II - 输入有序数组

167. 两数之和 II - 输入有序数组


题目链接:167. 两数之和 II - 输入有序数组

代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    //求链表表长
    int length(ListNode* head)
    {
        ListNode* p=head;
        int len=0;

        while(p)
        {
            p=p->next;
            len++;            
        }
        
        return len;
    }   

    //k个一组进行翻转
    ListNode* reverseKGroup(ListNode* head, int k) {
        //无节点或只有一个节点
        if(head==nullptr||head->next==nullptr)
            return head;
        
        //链表长度小于反转长度是就直接返回即可
        if(length(head)<k)
            return head;
        

        //创建一个头结点便于访问
        ListNode* Head=new ListNode;
        Head->next=head;
        ListNode *p=Head;

        //进行反转
        while(p&&p->next)
        {   
            //如果当前节点的链表长度够反转,就反转
            if(length(p->next)>=k)
            {
                ListNode *r=p;//指向k个一组的前一个结点,当作头结点便于头插
                ListNode *q=p->next;//指向k个一组的第一个节点
                r->next=nullptr;//断链操作便于插入

                //找到当前k个一组翻转链表最后一个节点的后一个节点
                //保存位置,防止断链
                ListNode* tail=q;
                for(int i=0;i<k;i++)
                    tail=tail->next;

                //进行翻转
                for(int i=0;i<k;i++)
                {
                    ListNode* temp=q;
                    q=q->next;

                    //头插法
                    temp->next=r->next;
                    r->next=temp;
                }

                //找到当前k个翻转的最后一个节点
                for(int i=0;i<k;i++)
                    r=r->next;

                //进行与后续链表的连接,防止断链
                p=r;//指向当前k个翻转的最后一个节点,便于后续遍历与访问
                r->next=tail;;
            }
            //不够反转就返回
            else
                break;
        }
        return Head->next;
    }
};

你可能感兴趣的:(leetcode,c++)