Reorder List and Sum of Left Leaves

Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…

You must do this in-place without altering the nodes’ values.

For example,
Given {1,2,3,4}, reorder it to {1,4,2,3}.

这个题目有点类似于综合题的感觉。对比给出实例。可以看出是将后半部的链表翻转后再与前半部合并。
算法分析:
1. 首先要分解链表,将链表一分为二。
2. 将后半部分链表倒序。
3. 合并两个链表。

class  Solution {
public:
   void reoderList(ListNode* head){
       if(head == NULL)
          return ;
       ListNode*   p1 = head;
       ListNode*    p2 = splitList(head);

       p2 = reverseList(p2);
       mergelist(p1,p2);
   }

  ListNode*  splitList(ListNode* head){
      ListNode*   slow = new ListNode(0);
      slow->next = head;
      ListNode*   fast = slow;
      while(fast->next && fast->next->next){
              slow = slow->next;
              fast = fast->next->next;
      }

     if(fast->next){
        slow = slow->next;
        fast = fast->next;
        }
        ListNode*  tmp = slow->next;
        slow->next =NULL;
         return tmp;
   }

  ListNode*  reverseList(ListNode*  head){
      if(head == NULL)
         return head;
       ListNode*  p=head;
       p = head->next;
       head->next = NULL;
       while(p){
            ListNode*   tmp = p->next;
            p->next = head;
            head = p;
            p = tmp;
       }
       return head;
  }

  void  mergelist(ListNode* p1,ListNode*  p2){
      while(p2){
         ListNode*   tmp = p2;
         p2 = p2->next;
         p1->next =p2;
         tmp->next = p1->next;
         p1 = p1->next->next;
      }
  }
};

再来看看二叉树:Sum of Left Leaves
计算所有左子树之和。
这个很容易理解,进行递归求解:

int  sumOfLeftLeaves(ListNode* root){
  if(root == NULL)  return 0;
if(root->left =NULL && root->left->left =NULL
           && root->left->right == NULL){
           return root->val + sumOfLeftLeaves(root->right);
           }
return sumOfLeftLeaves(root->left) + 
   sumOfLeftLeaves(root->right);

}

好了,今天的解析到此为止了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值