day17(反转链表)

题目描述

输入一个链表,反转链表后,输出新链表的表头。
 
 
提交链接:点击

 

思路:利用3个指针,一个指向当前节点,一个指向前一个节点,一个指向后一个节点。那么就地反转,就是将当前节点的next指向pre,然后将当前节点设置为前一个节点,让当前节点指向后一个节点(这是为下一轮做准备)。

 

代码:

 

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        //头插法实现
        ListNode *pre=NULL,*pnext=NULL;
        while(pHead!=NULL){
            pnext=pHead->next;  //pnext指向下一个节点
            pHead->next=pre;    //当前指针的next应该指向前一个节点
            pre=pHead;          //pre指向当前节点,为下一轮做准备
            pHead=pnext;         //pHead指向下一个节点,为下一轮做准备
        }
        return pre;
    }
    /*
        //递归
        if(pHead==NULL || pHead->next==NULL) return pHead;
        ListNode *Head=ReverseList(pHead->next);
        pHead->next->next=pHead;
        pHead->next=NULL;
        return Head;
   */
}; 

 

 

 

 

题目描述

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
 
 
提交链接:点击
 
 
思路:
 
 
代码:
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
        ListNode *newHead=new ListNode(-1),*Head;//newHead表示头结点
        newHead->next=NULL;   //最开始头结点指针域为空
        Head=newHead;   //Head指向头结点
        for(;pHead1!=NULL&&pHead2!=NULL;){
            if(pHead1->val <= pHead2->val){  //pHead1链表上的指小一些,则newHead->next指向pHead1,newHead、pHead1随着后移
                newHead->next=pHead1;
                pHead1=pHead1->next;
                newHead=newHead->next;
            }else{   //与上面正好相反
                newHead->next=pHead2;
                pHead2=pHead2->next;
                newHead=newHead->next;
            }
        }
        if(pHead1!=NULL) newHead->next=pHead1;  //如果pHead1上还有元素,则链接在尾部
        if(pHead2!=NULL) newHead->next=pHead2;
        return Head->next;
    }
};

 

posted on 2018-09-26 18:47  Magic_chao  阅读(100)  评论(0编辑  收藏  举报

导航