题目描述
思路:利用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; } };