目录
每一层函数功能:
两个结点比较,返回较小结点
迭代的两个问题:
往里走时:
下一步的递归区间:因为是从小到大排序,所以当p1<= p2时,下一步应该比较p1->next和p2;
出来时:
返回值是什么:最后出来时,最后一层肯定是直接返回的头节点,每一层也应该返回头结点,从小到达排序,因此当p1<= p2时,返回较小的头节点p1;
怎么处理:因为是从小到大,当p1<= p2时,因此出来时的头链接是p1->next = 返回值;
- /*
- struct ListNode {
- int val;
- struct ListNode *next;
- ListNode(int x) :
- val(x), next(NULL) {
- }
- };*/
- class Solution {
- public:
- ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
- //终止条件;
- if(!pHead1) return pHead2;
- if(!pHead2) return pHead1;
- //
- //函数功能:两个结点比较,返回较小结点
- //开始迭代的两个问题:
- //往里走时:下一步的递归区间:因为是从小到大排序,所以当p1<= p2时,下一步比较p1->next和p2;
- //出来时:返回值是什么,怎么处理;最后出来时,最后一层肯定是直接返回的头节点,因为是从小到大,因此出来时首先建立连接p1->p2;
- if(pHead1->val <= pHead2->val){
- pHead1->next = Merge(pHead1->next, pHead2);
- return pHead1;
- }else{
- pHead2->next = Merge(pHead1, pHead2->next);
- return pHead2;
- }
- }
- };
每一层函数功能:
先走到底,返回时将结点值放入容器;
迭代的两个问题:
往里走时:
终止条件:head = NULL;
出来时:
返回值是什么:使用& ,因此不需要返回值;
怎么处理:将结点值依次放入vector容器中;
- /**
- * struct ListNode {
- * int val;
- * struct ListNode *next;
- * ListNode(int x) :
- * val(x), next(NULL) {
- * }
- * };
- */
- class Solution {
- public:
- //这里使用&来传递,
- void reverseList(ListNode* head, vector<int>& v) {
- if(head != NULL){
- reverseList(head->next, v);
- v.push_back(head->val);
- }
- }
- vector<int> printListFromTailToHead(ListNode* head) {
- vector<int> v;
- reverseList(head, v);
- return v;
- }
- };
每一层函数功能:
先走到底,返回时将结点值放入容器;
迭代的两个问题:
往里走时:
终止条件:最后一个结点;即head.next = NULL;
出来时:
返回值是什么:最后一个结点,存着当头节点;
怎么处理:反转指向,之后p指针会自动往左跳;
- /*
- struct ListNode {
- int val;
- struct ListNode *next;
- ListNode(int x) :
- val(x), next(NULL) {
- }
- };*/
- class Solution {
- public:
- ListNode* ReverseList(ListNode* pHead) {
- //终止条件;
- if (pHead == NULL || pHead->next == NULL)
- return pHead;
- //
- ListNode* ret = ReverseList(pHead->next);
-
- pHead->next->next = pHead;
- pHead->next = NULL;
- return ret;
- }
- };