leecode twopointersは、2つのソートされたリンクリストをマージします

記事のディレクトリ

THE

問題

ここに画像の説明を挿入

ここに画像の説明を挿入

解決

コード


/*
struct ListNode {
   int val;
   struct ListNode *next;
   ListNode(int x) :
   		val(x), next(NULL) {
   }
   
   
思路: 合并问题采用双指针的基础操作,没有快慢, 只有对比。 从左边遍历到右边, 哪一边能走就走哪一边。 

-  define left right =head, current.
- while(left &&right)
- -  if left val < right val   current = left; current = current->next; left = left->next  ,  
- - else   current = right current = current ->next 
- 
};*/
class Solution {
    
    
public:
   ListNode* Merge(ListNode* pHead1, ListNode* pHead2){
    
    
       ListNode* left = pHead1;
       ListNode* right = pHead2;
       
       if(left==NULL){
    
    
           return right;
       }
       if(right==NULL){
    
    
           return left; 
       }        
       
       ListNode *current  = new ListNode(0);
       ListNode* h = current;
       
       
       while(left!=nullptr&&right!=nullptr){
    
    
           if(left->val<=right->val){
    
      // if we get same val , firt we make one into list , next step is another.
               current->next = left;
               current = current->next;
               left = left->next;
           }
     
           else if (left->val>right->val){
    
    
               current->next = right;
               current = current->next;
               right = right->next;           
           }
       }
       if(left)current->next = left;
       if(right)current->next = right;
       return h->next;
       
   }
};

まとめと考察

  1. ==の場合にどうなるかに注意してください。一方が通過した後、次の判断では、に等しいもう一方の判断も行われます。一緒に行けば大丈夫です。両側に1を追加します。
  2. 注==現在のポインタが単独で判断される場合、ポイントされている他のアドレスの内容を簡単に変更できます。Next.nextはここではお勧めしません。配列の場合は単独で判断しても問題ありませんが、リンクリストが乱雑なため、アドレスの内容が簡単に失われてしまいます。

おすすめ

転載: blog.csdn.net/liupeng19970119/article/details/114070095